tomo el fuego

Changes On Branch improve-svc-httpd
Login

Changes On Branch improve-svc-httpd

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch improve-svc-httpd Excluding Merge-Ins

This is equivalent to a diff from 0e49690ac0 to 492780058c

2022-12-17
05:37
MERGED_WITH 492780058ce6a534e108460826e0766719aaf175779ce1edd7c7a976b0d6210f check-in: 3499624307 user: r14c tags: master, trunk
05:25
fix interest-cohort header, add curl to build env, use realpath in upload util Leaf check-in: 492780058c user: r14c tags: improve-svc-httpd
02:47
add mk mkdirs command to build script check-in: 96891254e0 user: r14c tags: improve-svc-httpd
02:46
declare extern variables - fixes "multiple definition" errors check-in: 343ac4d637 user: r14c tags: master, trunk
2022-11-29
15:54
various improvements to svc/httpd * expand content type list * fix code format * fix "no query strings allowed" behavior (ignore them) check-in: aa3f94ea73 user: r14c tags: improve-svc-httpd
2022-11-28
02:20
update documentation, reorganize some host integration commands * clean up README.txt * update INSTALL to reflect changes to mkconfig * dis/tomo-init → dis/tomo-desktop * /tmp is required for acme to function (touch tmp/.keep) * mv tomo-dev utils/tomo-dev * add utils/start-tomo script with automatic screen resolution detection check-in: 0e49690ac0 user: r14c tags: master, trunk
2022-11-21
03:49
fix menu command for hub/9p.zone check-in: 59b5855800 user: r14c tags: master, trunk

Changes to .fossil-settings/ignore-glob.

90
91
92
93
94
95
96




90
91
92
93
94
95
96
97
98
99
100







+
+
+
+
libinterp/keyring.h
libinterp/loadermod.h
libinterp/mathmod.h
libinterp/runt.h
libinterp/sysmod.h
libinterp/tkmod.h
limbo/runt.h

services/httpd/httpd.debug
services/httpd/httpd.log
tomo-*-*-*-*.zip

Changes to .woodpecker.yml.

1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15







-
+







pipeline:
  Linux-386--debian:
    image: debian:stable-slim
    group: build
    commands:
      - dpkg --add-architecture i386
      - apt update >/dev/null
      - apt install -yy binutils:i386 gcc:i386 libc6-dev-i386 libx11-dev:i386 libxext-dev:i386 zip:i386 >/dev/null
      - apt install -yy curl:i386 binutils:i386 gcc:i386 libc6-dev-i386 libx11-dev:i386 libxext-dev:i386 zip:i386 >/dev/null
      - ./utils/tomo-dev.sh build-Linux `pwd`
      - rm -rf .git .hg
      - zip -r "tomo-Linux-386--debian-$CI_COMMIT_SHA-$CI_BUILD_STARTED.zip" *
      - ./utils/tomo-dev.sh upload-ci "tomo-Linux-386--debian-$CI_COMMIT_SHA-$CI_BUILD_STARTED.zip"
#  Linux-386--ubuntu:
#    image: ubuntu:bionic
#    group: build

Changes to FreeBSD/386/include/fpuctl.h.

1
2


3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62


1
2
3
4
5


















































6
7
8
9
10
11
12
-
-
+
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







/*
 * Linux 386 fpu support
/* vi: ts=8
 * FreeBSD 386 fpu support
 * Mimic Plan9 floating point support
 */

static void
setfcr(ulong fcr)
{
	__asm__(	"xorb	$0x3f, %%al\n\t"
			"pushw	%%ax\n\t"
			"fwait\n\t"
			"fldcw	(%%esp)\n\t"
			"popw	%%ax\n\t"
			: /* no output */
			: "al" (fcr)
	);
}

static ulong
getfcr(void)
{
	ulong fcr = 0;

	__asm__(	"pushl	%%eax\n\t"
			"fwait\n\t"
			"fstcw	(%%esp)\n\t"
			"popl	%%eax\n\t"
			"xorb	$0x3f, %%al\n\t"
			: "=a"  (fcr)
			: "eax"	(fcr)
	);
	return fcr; 
}

static ulong
getfsr(void)
{
	ulong fsr = -1;

	__asm__(	"fwait\n\t"
			"fstsw	(%%eax)\n\t"
			"movl	(%%eax), %%eax\n\t"
			"andl	$0xffff, %%eax\n\t"
			: "=a"  (fsr)
			: "eax" (&fsr)
	);
	return fsr;
}

static void
setfsr(ulong fsr)
{
	__asm__("fclex\n\t");
}

/* FCR */
#define	FPINEX	(1<<5)
#define	FPUNFL	((1<<4)|(1<<1))
#define	FPOVFL	(1<<3)
#define	FPZDIV	(1<<2)
#define	FPINVAL	(1<<0)
#define	FPRNR	(0<<10)

Deleted acme/mail/guide.

1
2
3
4
5





-
-
-
-
-
Mail /mail/box/$user/stored
Mail
Mailpop3
mkbox /mail/box/$user/new_box
mail -'x' someaddress

Deleted acme/mail/readme.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29





























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Mail is the single program in this directory.  Its argument specifies
the mail box to read, default /mail/box/$user/mbox.
For example, running
	Mail /mail/box/$user/stored
(a line in the guide file) looks at saved mail.

Mail maintains a window containing headers for all the
messages in the mailbox and monitors the mailbox for new messages.
Using button 3 to indicate a message number opens
a window on that message.   commands in the mailbox window are
	Put		Write the mailbox back to the file (never done automatically)
	Mail		Make a new message window ready to mail someone.
			Takes argument names analogously to acme's New.
	Del		Exit Mail, after checking that mailbox isn't modified.
New messages appear at the top of the window and are highlighted upon arrival.
(The messages are numbered oldest to newest, the opposite of regular mail.)

Message windows have a simple format: the first line, up to the first tab or newline,
holds the sender or, when sending, the addressee.  Edit the line to change who the
message goes to.  Message windows contain the commands
	Reply	Make a new window to compose a reply to this message
	Delmesg	Delete the message from the screen and from the mailbox
	Del		Delete the window, leaving the message in the mailbox
	Post		Send the message to the addressee
	Save		Save to the named mailbox, default/mail/box/$user/stored
Save takes a full file name; if that name has no slashes, the file is taken
to be in /mail/box/$user and must already exist. Use mkbox in the guide to
create target mailboxes in /mail/box/$user.
Reply and mail windows contain an obvious subset of the commands.

Changes to appl/acme/acme.b.

173
174
175
176
177
178
179
180
181
182



183
184
185
186
187
188
189
173
174
175
176
177
178
179



180
181
182
183
184
185
186
187
188
189







-
-
-
+
+
+








waitpid0, waitpid1 : int;
mainpid : int;

fontcache : array of ref Reffont;
nfontcache : int;
reffonts : array of ref Reffont;
deffontnames := array[2] of {
	"/fonts/lucidasans/euro.8.font",
	"/fonts/lucm/unicode.9.font",
deffontnames := array[2] of { # TODO theme support
	"/fonts/hermit/regular/16/font",
	"/fonts/BQN386/16/font",
};

command : ref Command;

WPERCOL : con 8;

NSnarf : con 32;

Changes to appl/charon/mkfile.

81
82
83
84
85
86
87

88
89


90
91
92
81
82
83
84
85
86
87
88


89
90
91
92
93







+
-
-
+
+



install:V:	$ROOT/dis/charon.dis

$ROOT/dis/charon.dis:	charon.dis
	rm -f $target && cp charon.dis $target

charon.dis:	$MODULES $SYS_MODULES

# see </tktview/c235634a814ed923f35e6aae88f18b36e35716b3>
img.dis:	img.b $MODULE $SYS_MODULE
	limbo $LIMBOFLAGS -c -gw img.b
#img.dis:	img.b $MODULE $SYS_MODULE
#	limbo $LIMBOFLAGS -c -gw img.b

nuke:V:
	rm -f $ROOT/dis/charon.dis

Changes to appl/cmd/ip/mkfile.

1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16

17
18

19
20


21
22
23






24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40











+





+


+


+
+



+
+
+
+
+
+






<../../../mkconfig

DIRS=\
	ppp\
#	nppp\

TARG=\
	bootpd.dis\
	dhcp.dis\
	ping.dis\
	rip.dis\
	shttpd.dis\
	tftpd.dis\
	virgild.dis\
	sntp.dis\

SYSMODULES=\
	arg.m\
	attrdb.m\
	bufio.m\
	daytime.m\
	dhcp.m\
	draw.m\
	encoding.m\
	env.m\
	ether.m\
	ip.m\
	ipattr.m\
	keyring.m\
	regex.m\
	mhttp.m\
	security.m\
	sh.m\
	string.m\
	sys.m\

DISBIN=$ROOT/dis/ip

<$ROOT/mkfiles/mkdis
<$ROOT/mkfiles/mksubdirs

Added appl/cmd/ip/shttpd.b.




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
# <6972b3440c27a83c1a56c5ecc781148514fb1f11>
# <https://github.com/mjl-/httpd/>
# <https://git.heropunch.io/ar/inferno-httpd/>
implement Shttpd;

# features:
#
# - http/1.0, http/1.1 (keep-alive, chunked responses).  no "http/0.9".
# - cgi and scgi support
# - virtual hosts
# - determining content-type based on file extension
# - error/access logging
# - index file serving, html directory listings
# - http basic authentication
# - "range" requests, for random access to files
# - redirections with regular expressions
# - configuration in attrdb format
# - as compliant as possible, where reasonable
# - mindful of security
#
# see the manual page for full documentation
#
# non-features:
#
# - connection rate limiting.  should be done at a higher level, e.g. firewall.
# - silly "correct" behavior per RFC
#
# testing/todo:
#
# - doc/shttpd-testing.txt can be used for testing.  it has to be done manually,
#   enough corner cases have not been tested, but quite a few have.
# - when responding with chunked data, can we embed an error message in a chunks
#   comment-part when an error with reading the data occurs?
# - support transfer-encoding chunked and compressed content-encodings from client?
# - check for security issues with http
# - think of ssl?
# - try to fix dir listings for paths with multiple slashes in them.  firefox breaks
#   on them, is firefox right?
# - test with other browsers

include "sys.m";
	sys: Sys;
	print, sprint, fprint, fildes: import sys;
include "draw.m";
include "arg.m";
include "bufio.m";
	bufio: Bufio;
	Iobuf: import bufio;
include "daytime.m";
	daytime: Daytime;
include "env.m";
	env: Env;
include "string.m";
	str: String;
include "keyring.m";
	keyring: Keyring;
include "security.m";
	random: Random;
include "encoding.m";
	base64: Encoding;
include "sh.m";
	sh: Sh;
include "ip.m";
	ipm: IP;
	IPaddr: import ipm;
include "attrdb.m";
	attrdb: Attrdb;
	Db, Dbentry, Tuples: import attrdb;
include "regex.m";
	regex: Regex;
include "mhttp.m";
	http: Http;
	Url, Req, Resp, Hdrs, HTTP_10, HTTP_11, encodepath: import http;
	UNKNOWN, OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT: import http;

Version: con "~tomo/shttpd/0";


Repl: adt {
	re:	regex->Re;
	rule:	list of ref (string, int);	# literal string, replacement group for regex
	maxrepl:	int;	# highest replacement group

	parse:	fn(restr, rulestr: string): (ref Repl, string);
	apply:	fn(r: self ref Repl, s: string): (int, string, string);
};

# config for a single host,port
Cfg: adt {
	host, port:	string;
	listings:	array of ref (string, int);  # path prefix, list (true/false)
	cachesecs:	int;
	listens:	list of ref (string, string);	# ip, port
	cgipaths:	list of ref (string, string, list of string, int);	# path, cmd|addr, methods, Cgi|Scgi
	indexfiles:	list of string;
	redirs:	list of ref Repl;
	auths:	list of ref (string, string, string);	# path, realm, base64 user:pass
	gzpaths:	list of string;

	new:	fn(): ref Cfg;
	read:	fn(e: ref Dbentry, defaultport: string): (ref Cfg, string);
	rev:	fn(cfg: self ref Cfg);
};

# config file, holds one Cfg per host,port
Cfgs: adt {
	file:	string;
	db:	ref Db;
	default:	ref Cfg;
	cfgs:	list of (string, string, ref Cfg);	# host, port (for lookup) => config

	accessfd:	ref Sys->FD;
	debugflag, vhostflag:	int;
	addrs:	list of string;
	usertypes:	list of ref (string, string);

	init:	fn(file: string): (ref Cfgs, string);
	read:	fn(file: string, db: ref Db): (ref Cfgs, string);
	find:	fn(c: self ref Cfgs, host, port: string): ref Cfg;
};

# represents a connection and a request on it
Op: adt {
	id:	int;	# connection id, for logging
	now:	int;	# time of start
	keepalive:	int;
	chunked:	int;
	length:		big;
	fd:	ref Sys->FD;
	inb:	ref Bufio->Iobuf;
	rhost, rport, lhost, lport:	string;
	req:	ref Req;
	resp:	ref Resp;
	cfgs:	ref Cfgs;
	cfg:	ref Cfg;
};

Cgitimeoutsecs: con 3*60;
Keepalivesecs: con 3*60;
defaddr: con "net!*!http";

debugflag: int;

webroot: string;
credempty: string;
ctlchan := "";

environment: list of (string, string);

Shttpd: module {
	init:	fn(nil: ref Draw->Context, args: list of string);
};

mimetypes := array[] of {
	(".avi",	"video/x-msvideo"),
	(".b",		"text/plain; charset=utf-8"),
	(".bmp",	"image/bmp"),
	(".bz2",	"application/x-bzip"),
	(".c",		"text/plain; charset=utf-8"),
	(".conf",	"text/plain; charset=utf-8"),
	(".css",	"text/css"),
	(".diff",	"text/plain; charset=utf-8"),
	(".doc",	"application/msword"),
	(".dvi",	"application/x-dvi"),
	(".eps",	"application/postscript"),
	(".gif",	"image/gif"),
	(".gz",		"application/x-gzip"),
	(".h",		"text/plain; charset=utf-8"),
	(".htm",	"text/html; charset=utf-8"),
	(".html",	"text/html; charset=utf-8"),
	(".ico",	"image/x-icon"),
	(".jpeg",	"image/jpeg"),
	(".jpg",	"image/jpeg"),
	(".js",		"text/javascript; charset=utf-8"),
	(".man",	"text/plain; charset=utf-8"),
	(".me",		"text/plain; charset=utf-8"),
	(".mp3",	"audio/mpeg"),
	(".mp4",	"video/mp4"),
	(".mpeg",	"video/mpeg"),
	(".mpg",	"video/mpeg"),
	(".ms",		"text/plain; charset=utf-8"),
	(".ogg",	"application/ogg"),
	(".orig",	"text/plain; charset=utf-8"),
	(".patch",	"text/plain; charset=utf-8"),
	(".pdf",	"application/pdf"),
	(".png",	"image/png"),
	(".ppt",	"application/vnd.ms-powerpoint"),
	(".ps",		"application/postscript"),
	(".py",		"text/plain; charset=utf-8"),
	(".roff",	"text/plain; charset=utf-8"),
	(".sh",		"text/plain; charset=utf-8"),
	(".svg",	"image/svg+xml"),
	(".t",		"text/plain; charset=utf-8"),
	(".tar",	"application/x-tar"),
	(".tar.bz2",	"application/x-bzip-compressed-tar"),
	(".tar.gz",	"application/x-tgz"),
	(".tbz",	"application/x-bzip-compressed-tar"),
	(".tex",	"text/plain; charset=utf-8"),
	(".tgz",	"application/x-tgz"),
	(".tif",	"image/tiff"),
	(".tiff",	"image/tiff"),
	(".torrent",	"application/x-bittorrent"),
	(".txt",	"text/plain; charset=utf-8"),
	(".wav",	"audio/x-wav"),
	(".woff",	"application/font-woff"),
	(".woff2",	"font/woff2"),
	(".xls",	"application/vnd.ms-excel"),
	(".y",		"text/plain; charset=utf-8"),
	(".zip",	"application/zip"),
};

Eok:			con 200;
Epartialcontent:	con 206;
Emovedpermanently:	con 301;
Enotmodified:		con 304;
Ebadrequest:		con 400;
Eunauthorized:		con 401;
Eforbidden:		con 403;
Enotfound:		con 404;
Emethodnotallowed:	con 405;
Elengthrequired:	con 411;
Epreconditionfailed:	con 412;
Ebadmediatype:		con 415;
Enotsatisfiable:	con 416;
Eexpectationfailed:	con 417;
Eservererror:		con 500;
Enotimplemented:	con 501;
Ebadversion:		con 505;

statusmsgs := array[] of {
	(100,		"Continue"),
	(200,		"OK"),
	(206,		"Partial Content"),
	(301,		"Moved Permanently"),
	(304,		"Not Modified"),
	(400,		"Bad Request"),
	(401,		"Unauthorized"),
	(403,		"Forbidden"),
	(404,		"Object Not Found"),
	(405,		"Method Not Allowed"),
	(411,		"Length Required"),
	(412,		"Precondition Failed"),
	(415,		"Unsupported Media Type"),
	(416,		"Requested Range Not Satisfiable"),
	(417,		"Expectation Failed"),
	(500,		"Internal Server Error"),
	(501,		"Not Implemented"),
	(505,		"HTTP Version Not Supported"),
};

# relevant known request headers whose values are not allowed to be concatenated (not a bnf #-rule, see rfc2616#2.1)
nomergeheaders := array[] of {
	# these two would be useful to merge.  alas, it is not allowed by rfc2616, section 4.2, last paragraph
	"if-match",
	"if-none-match",

	"authorization",
	"content-length",
	"content-type",
	"host",
	"if-modified-since",
	"if-range",
	"if-unmodified-since",
	"range",
};

idch: chan of int;
randch: chan of int;
killch: chan of int;
killschedch: chan of (int, int, chan of int);
excch: chan of (int, chan of string);
warnch: chan of (int, string);
cfgsgetch: chan of chan of ref Cfgs;
newcfgsch: chan of ref Cfgs;
logch: chan of (string, string);
logfdch: chan of ref Sys->FD;

timefd: ref Sys->FD;
errorfd: ref Sys->FD;

Cgi, Scgi: con iota;
cgitypes := array[] of {"cgi", "scgi"};

cgispawnch: chan of (string, string, string, ref Op, big, chan of (ref Sys->FD, ref Sys->FD, string));
scgidialch: chan of (string, chan of (ref Sys->FD, string));

init(nil: ref Draw->Context, args: list of string)
{
	sys = load Sys Sys->PATH;
	bufio = load Bufio Bufio->PATH;
	env = load Env Env->PATH;
	daytime = load Daytime Daytime->PATH;
	keyring = load Keyring Keyring->PATH;
	random = load Random Random->PATH;
	str = load String String->PATH;
	base64 = load Encoding Encoding->BASE64PATH;
	sh = load Sh Sh->PATH;
	ipm = load IP IP->PATH;
	ipm->init();
	attrdb = load Attrdb Attrdb->PATH;
	err := attrdb->init();
	if(err != nil)
		fail("loading attrdb: "+err);
	regex = load Regex Regex->PATH;
	http = load Http Http->PATH;
	http->init(bufio);

	cfgs: ref Cfgs;

	(cfgs, err) = Cfgs.init("/dev/null");
	if(err != nil)
		fail("making empty config: "+err);
	defcfg := cfgs.default;

	arg := load Arg Arg->PATH;
	arg->init(args);
	arg->setusage(arg->progname()+" [-dh] [-A path realm user:pass] [-C cachesecs] [-L listpath 0|1] [-a addr] [-c path command methods] [-f ctlchan] [-i indexfile] [-l logfile] [-n config] [-r pathre dest] [-s path addr methods] [-t extension mimetype] [-z gzippath] webroot");
	while((c := arg->opt()) != 0)
		case c {
		'A' =>	defcfg.auths = ref (arg->earg(), arg->earg(), base64->enc(array of byte arg->earg()))::defcfg.auths;
			if(haschar((hd defcfg.auths).t1, '"')) {
				fprint(fildes(2), "realm must not have double quote, not supported by http/1.0");
				raise "fail:usage";
			}
		'C' =>	defcfg.cachesecs = int arg->earg();
		'L' =>	path := arg->earg();
			what := int arg->earg();
			nl := array[len defcfg.listings+1] of ref (string, int);
			nl[:] = defcfg.listings;
			nl[len defcfg.listings] = ref (path, what);
			defcfg.listings = nl;
		'a' =>	cfgs.addrs = arg->earg()::cfgs.addrs;
		'c' =>	defcfg.cgipaths = ref (arg->earg(), arg->earg(), sys->tokenize(arg->earg(), " ,").t1, Cgi)::defcfg.cgipaths;
		'd' =>	cfgs.debugflag++;
		'f' =>	ctlchan = arg->earg();
		'h' =>	cfgs.vhostflag++;
		'i' =>	defcfg.indexfiles = arg->earg()::defcfg.indexfiles;
		'l' =>	logfile := arg->earg();
			cfgs.accessfd = sys->open(logfile, Sys->OWRITE);
			if(cfgs.accessfd == nil)
				fail(sprint("open logfile %q: %r", logfile));
			sys->seek(cfgs.accessfd, big 0, Sys->SEEKEND);

		'n' =>
			file := arg->earg();
			(cfgs, err) = Cfgs.init(file);
			if(err != nil) {
				fprint(fildes(2), "reading %q: %s\n", file, err);
				raise "fail:usage";
			}
			defcfg = cfgs.default;
			defcfg.rev();
			cfgs.usertypes = rev(cfgs.usertypes);
			cfgs.addrs = rev(cfgs.addrs);
		'r' =>
			(restr, rulestr) := (arg->earg(), arg->earg());
			(repl, rerr) := Repl.parse(restr, rulestr);
			if(err != nil) {
				fprint(fildes(2), "parsing redir %q %q: %s\n", restr, rulestr, rerr);
				raise "fail:usage";
			}
			defcfg.redirs = repl::defcfg.redirs;
		's' =>	defcfg.cgipaths = ref (arg->earg(), arg->earg(), sys->tokenize(arg->earg(), " ,").t1, Scgi)::defcfg.cgipaths;
		't' =>	cfgs.usertypes = ref (arg->earg(), arg->earg())::cfgs.usertypes;
		'z' =>	defcfg.gzpaths = arg->earg()::defcfg.gzpaths;
		* =>	arg->usage();
		}
	args = arg->argv();
	if(len args != 1)
		arg->usage();
	webroot = hd args;
	defcfg.rev();
	cfgs.usertypes = rev(cfgs.usertypes);
	cfgs.addrs = rev(cfgs.addrs);
	credempty = base64->enc(array of byte ":");	# empty-user:empty-pass

	environment = env->getall();

	pid := sys->pctl(Sys->NEWPGRP|Sys->FORKNS|Sys->FORKENV|Sys->FORKFD, nil);
	if(pid < 0)
		fail(sprint("pctl: %r"));
	if(sys->chdir(webroot) != 0)
		fail(sprint("chdir webroot %q: %r", webroot));

	if(ctlchan != nil) {
		fio := sys->file2chan("/chan", ctlchan);
		if(fio == nil)
			fail(sprint("file2chan in /chan: %q: %r", ctlchan));
		spawn ctlhandler(fio);
	}

	timefd = sys->open("/dev/time", Sys->OREAD);
	if(timefd == nil)
		fail(sprint("open /dev/time: %r"));

	errorfd = sys->open("/services/logs/shttpderror", Sys->OWRITE);
	if(errorfd != nil)
		sys->seek(errorfd, big 0, Sys->SEEKEND);

	idch = chan[8] of int;
	spawn idgen();
	randch = chan of int;
	spawn randgen();
	killch = chan of int;
	killschedch = chan of (int, int, chan of int);
	spawn killer();
	excch = chan of (int, chan of string);
	spawn exceptsetter();
	warnch = chan of (int, string);
	spawn warner();

	cfgsgetch = chan of chan of ref Cfgs;
	newcfgsch = chan of ref Cfgs;
	spawn cfgsserver();

	logch = chan of (string, string);
	logfdch = chan of ref Sys->FD;
	spawn logger();

	newcfgsch <-= cfgs;

	cgispawnch = chan of (string, string, string, ref Op, big, chan of (ref Sys->FD, ref Sys->FD, string));
	spawn cgispawner();

	scgidialch = chan of (string, chan of (ref Sys->FD, string));
	spawn scgidialer();

	if(cfgs.addrs == nil)
		cfgs.addrs = defaddr::nil;
	for(addrs := rev(cfgs.addrs); addrs != nil; addrs = tl addrs) {
		addr := hd addrs;
		(aok, aconn) := sys->announce(addr);
		if(aok != 0)
			fail(sprint("announce %q: %r", addr));
		spawn listen(hd addrs, aconn, sync := chan of int);
		<-sync;
	}
	warn(0, sprint("shttpd started at %s", daytime->time()));
}

listen(addr: string, aconn: Sys->Connection, sync: chan of int)
{
	sync <-= 0;
	for(;;) {
		(lok, lconn) := sys->listen(aconn);
		if(lok != 0)
			fail(sprint("listen %q: %r", addr));
		dfd := sys->open(lconn.dir+"/data", Sys->ORDWR);
		if(dfd != nil)
			spawn httpserve(dfd, lconn.dir);
		else
			warn(0, sprint("open connection file: %r"));
		lconn.dfd = nil;
	}
}

idgen()
{
	id := 1;
	for(;;)
		idch <-= id++;
}

randgen()
{
	for(;;)
		randch <-= random->randomint(Random->NotQuiteRandom);
}

killer()
{
	for(;;) alt {
	pid := <-killch =>
		kill(pid);
	(pid, timeout, respch) := <-killschedch =>
		spawn timeoutkill(pid, timeout, respch);
	}
}

cfgsserver()
{
	cfgs: ref Cfgs;

	for(;;) alt {
	respch := <-cfgsgetch =>
		respch <-= cfgs;
	cfgs = <-newcfgsch =>
		# non-atomic wrt other threads...  not much to do about it
		debugflag = cfgs.debugflag;
		logfdch <-= cfgs.accessfd;
	}
}

timeoutkill(pid, timeout: int, respch: chan of int)
{
	respch <-= sys->pctl(0, nil);
	sys->sleep(timeout);
	kill(pid);
}

exceptsetter()
{
	for(;;) {
		(pid, respch) := <-excch;
		err: string;
		fd := sys->open(sprint("/prog/%d/ctl", pid), Sys->OWRITE);
		if(fd == nil || fprint(fd, "exceptions notifyleader") == -1)
			err = sprint("setting exception handling for pid %d: %r", pid);
		if(respch == nil && err != nil) {
			warn(0, sprint("setting exceptions notifyleader for pid %d: %s", pid, err));
			kill(pid);
		}
		if(respch != nil)
			respch <-= err;
	}
}

warner()
{
	for(;;) {
		(id, s) := <-warnch;
		if(s != nil && s[len s-1] == '\n')
			s = s[:len s-1];
		warn(id, s);
	}
}

cgispawner()
{
	for(;;) {
		(cmd, path, cgipath, op, length, replych) := <-cgispawnch;
		spawn cgispawn(cmd, path, cgipath, op, length, replych);
	}
}

cgispawn(cmd, path, cgipath: string, op: ref Op, length: big, replych: chan of (ref Sys->FD, ref Sys->FD, string))
{
	p0 := array[2] of ref Sys->FD;
	p1 := array[2] of ref Sys->FD;
	p2 := array[2] of ref Sys->FD;
	if(sys->pipe(p0) != 0 || sys->pipe(p1) != 0 || sys->pipe(p2) != 0) {
		replych <-= (nil, nil, sprint("pipe: %r"));
		return;
	}

	spawn errlogger(op, p2[0]);

	if(sys->pctl(Sys->NEWPGRP|Sys->NEWFD|Sys->FORKNS|Sys->FORKENV, p0[0].fd::p1[0].fd::p0[1].fd::p1[1].fd::p2[1].fd::nil) < 0) {
		replych <-= (nil, nil, sprint("pctl newpgrp,newfd,forkns,forkenv: %r"));
		return;
	}

	for(l := cgivars(path, cgipath, op, length, nil); l != nil; l = tl l) {
		epath := "/env/"+(hd l).t0;
		efd := sys->create(epath, Sys->OWRITE, 8r666);
		if(efd == nil) {
			replych <-= (nil, nil, sprint("open %q: %r", epath));
			return;
		}
		d := array of byte (hd l).t1;
		if(sys->write(efd, d, len d) != len d) {
			replych <-= (nil, nil, sprint("write %q: %r", epath));
			return;
		}
	}

	if(sys->dup(p0[1].fd, 0) == -1 || sys->dup(p1[1].fd, 1) == -1 || sys->dup(p2[1].fd, 2) == -1) {
		replych <-= (nil, nil, sprint("dup: %r"));
		return;
	}

	replych <-= (p0[0], p1[0], nil);

	p0[1] = fildes(p0[1].fd);
	p1[1] = fildes(p1[1].fd);
	p2[1] = fildes(p2[1].fd);
	p0[0] = p1[0] = p2[0] = nil;

	err := sh->system(nil, cmd);
	if(err != nil)
		warnch <-= (op.id, sprint("cgispawn, command %q: %s", cmd, err));
}

errlogger(op: ref Op, fd: ref Sys->FD)
{
	for(;;) {
		n := sys->read(fd, d := array[Sys->ATOMICIO] of byte, len d);
		if(n < 0)
			warnch <-= (op.id, sprint("reading stderr: %r"));
		if(n <= 0)
			break;
		warnch <-= (op.id, string d[:n]);
	}
}

scgidialer()
{
	for(;;) {
		(scgiaddr, replychan) := <-scgidialch;
		spawn scgidial(scgiaddr, replychan);
	}
}

scgidial(scgiaddr: string, replychan: chan of (ref Sys->FD, string))
{
	(ok, conn) := sys->dial(scgiaddr, nil);
	if(ok < 0)
		replychan <-= (nil, sprint("dialing scgid %q: %r", scgiaddr));
	else
		replychan <-= (conn.dfd, nil);
}

ctlhandler(fio: ref Sys->FileIO)
{
	for(;;) alt {
	(nil, nil, nil, rc) := <- fio.read =>
		if(rc == nil)
			continue;
		rc <-= (nil, "permission denied");

        (nil, data, nil, wc) := <- fio.write =>
                if(wc == nil)
                        continue;
		s := string data;
		if(s != nil && s[len s-1] == '\n')
			s = s[:len s-1];
		case s {
		"reload" =>
			cfgsgetch <-= respch := chan of ref Cfgs;
			cfgs := <-respch;

			if(cfgs.db.reopen() != 0) {
				msg := sprint("reopening config file: %r");
				warn(0, msg);
				wc <-= (0, msg);
				continue;
			}
			(ncfgs, err) := Cfgs.read(cfgs.file, cfgs.db);
			if(err != nil) {
				msg := "error reloading config, keeping current: "+err;
				warn(0, msg);
				wc <-= (0, msg);
				continue;
			}
			newcfgsch <-= ncfgs;
			warn(0, "config file reloaded");
			wc <-= (len data, nil);
		* =>
			wc <-= (0, sprint("bad command: %q", s));
		}
	}
}

httpserve(fd: ref Sys->FD, conndir: string)
{
	id := <-idch;
	if(debugflag) say(id, "httpserve");

	(lhost, lport) := readaddr(id, conndir+"/local");
	(rhost, rport) := readaddr(id, conndir+"/remote");
	lhost = IPaddr.parse(lhost).t1.text();
	rhost = IPaddr.parse(rhost).t1.text();
	if(debugflag) say(id, sprint("connect from %s:%s to %s:%s", rhost, rport, lhost, lport));

	pid := sys->pctl(Sys->NEWPGRP|Sys->FORKNS|Sys->NODEVS, nil);
	if(pid < 0)
		die(id, sprint("pctl: %r"));
	excch <-= (pid, nil);
	if(sys->bind(webroot,  "/", Sys->MREPL) < 0)
		die(id, sprint("bind %q /: %r", webroot));

	b := bufio->fopen(fd, Bufio->OREAD);
	if(b == nil)
		die(id, sprint("bufio open: %r"));

	op := ref Op(id, 0, 0, 0, big 0, fd, b, rhost, rport, lhost, lport, nil, nil, nil, nil);

	for(nsrvs := 0; ; nsrvs++) {
		if(nsrvs > 0 && !op.keepalive)
			break;

		if(sys->chdir("/") != 0)
			break;

		op.chunked = op.keepalive = 0;
		op.length = big -1;
		op.req = nil;
		op.resp = nil;
		op.cfgs = nil;
		op.cfg = nil;
		httptransact(pid, b, op);
	}
}

httptransact(pid: int, b: ref Iobuf, op: ref Op)
{
	id := op.id;
	op.now = readtime();

	hdrs := Hdrs.new(("server", Version)::nil);

	# "You know they'll never really die while the Trunk is alive[...]
	#  It lives while the code is shifted, and they live with it, always Going Home."
	# - Moist von Lipwig, Going Postal, Chapter 13
	# "A man is not dead while his name is still spoken."
	# - Going Postal, Chapter 4 prologue
	# <http://www.gnuterrypratchett.com/>
	hdrs.add("X-Clacks-Overhead", "GNU Geo Rivera");
	hdrs.add("X-Clacks-Overhead", "GNU Alejandra Agredo");
	# we love and miss you dear friends

	# disable FLoC
	hdrs.add("Permissions-Policy", "interest-cohort=()");

	# kill ourself when no request comes in
	killschedch <-= (pid, Keepalivesecs*1000, respch := chan of int);
	killpid := <-respch;

	(req, rerr) := Req.read(b);
	cfgsgetch <-= cfgsrespch := chan of ref Cfgs;
	op.cfgs = <-cfgsrespch;

	hdrs.add("date", httpdate(op.now));
	if(rerr != nil || req.major != 1 || req.method == UNKNOWN) {
		st := Ebadrequest;
		if(rerr == nil && req.major != 1) {
			st = Ebadversion;
			rerr = sprint("Version requested is HTTP/%d.%d", req.major, req.minor);
		} else if(rerr == nil && req.method == UNKNOWN) {
			st = Enotimplemented;
			rerr = sprint("Method %q not supported", req.methodstr);
		}

		stmsg := statusmsg(st);
		op.resp = Resp.mk(HTTP_10, string st, stmsg, hdrs);

		html := array of byte mkhtml(sprint("%d - %s: %s", st, stmsg, rerr));

		op.resp.h.add("content-type", "text/html; charset=utf-8");
		op.resp.h.add("content-length", string len html);

		err := hresp(op.resp, op.fd, 0, 0);
		if(err == nil)
			sys->write(op.fd, html, len html);

		killch <-= killpid;
		die(id, "reading request: "+rerr);
	}
	killch <-= killpid;
	if(debugflag) say(id, sprint("request: method %q url %q version %q",
		req.methodstr, req.url.pack(), sprint("HTTP/%d.%d", req.major, req.minor)));
	op.req = req;

	# all values besides "close" are supposedly header names, not important
	(contoks, conerr) := tokenize(req.h.getlist("connection"));
	if(conerr != nil || len contoks == 0 && req.h.has("connection", nil))
		return responderrmsg(op, Ebadrequest, sprint("Bad Request: Bad value for header \"Connection\""));

	op.keepalive = req.version() >= HTTP_11 && conerr == nil && !listhas(contoks, "close");
	op.resp = resp := Resp.mk(req.version(), "200", "OK", hdrs);

	# tell client if it is sending ambiguous requests: duplicate headers of the important kind
	for(i := 0; i < len nomergeheaders; i++)
		if(len req.h.findall(nomergeheaders[i]) > 1)
			return responderrmsg(op, Ebadrequest, sprint("Bad Request: Duplicate headers:  \"%s\"", nomergeheaders[i]));

	if(req.h.has("proxy-authorization", nil))
		return responderrmsg(op, Ebadrequest, "Bad Request: Proxy-Authorization credentials sent, unacceptable");

	if(req.version() >= HTTP_11 && !req.h.has("host", nil))
		return responderrmsg(op, Ebadrequest, "Bad Request: Missing header \"Host\"");

	# when host-header is absent, we'll request the empty host name, the default
	host := splithost(req.h.get("host")).t0;
	if(str->drop(host, "0-9a-zA-Z.:-") != nil || str->splitstrl(host, "..").t1 != nil)
		return responderrmsg(op, Ebadrequest, nil);

	cfg := op.cfg = op.cfgs.find(host, op.lport);
	if(cfg == nil)
		return responderrmsg(op, Enotfound, nil);

	# do not accept request when doing vhost and request is from ip that we shouldn't serve host:port on
	if(op.cfgs.vhostflag && cfg.listens != nil) {
		addrokay := 0;
		for(ls := cfg.listens; !addrokay && ls != nil; ls = tl ls) {
			(chost, cport) := *(hd ls);
			addrokay = chost == op.lhost && cport == op.lport;
		}
		if(!addrokay) {
			say(id, "request on ip:port, not allowed");
			return responderrmsg(op, Enotfound, nil);
		}
	}

	if(req.version() == HTTP_10 && req.method != GET && req.method != HEAD && req.method != POST)
		return responderrmsg(op, Enotimplemented, sprint("Unknown Method: \"%s\"", req.methodstr));

	if(hasbody(op.req) && (req.method == GET || req.method == HEAD || req.method == TRACE || req.method == DELETE)) {
		op.keepalive = 0;
		return responderrmsg(op, Ebadrequest, "Bad Request: Entity not allowed in request");
	}
	# for other methods, we ignore bodies by closing the connection.  saner than reading and discarding...

	case req.method {
	GET or HEAD =>
		;
	POST =>
		if(hasbody(op.req))
			op.keepalive = 0;
	TRACE =>
		# bug: the response does not have * as path, but /
		return respond(op, Eok, req.pack(), "message/http");

	OPTIONS =>
		# only (s)cgi paths allow POST, but we won't say, the path may require auth as well.  what to do then?
		hdrs.add("allow", "OPTIONS, GET, HEAD, POST, TRACE");
		hdrs.add("accept-ranges", "bytes");
		if(hasbody(op.req))
			op.keepalive = 0;
		return responderrmsg(op, Eok, nil);

	PUT or DELETE =>
		# note: when implementing these, complete support for if-match and if-none-match, and much more probably
		if(hasbody(op.req))
			op.keepalive = 0;
		return responderrmsg(op, Enotimplemented, "Not Implemented: PUT and DELETE are not supported");

	* =>
		if(hasbody(op.req))
			op.keepalive = 0;
		return responderrmsg(op, Enotimplemented, sprint("Unknown Method: \"%s\"", req.methodstr));
	}

	# remove occurrences of "/elem/../" from path, returned path always starts with "/"
	path := pathsanitize(req.url.path);

	# we ignore the port in the host-header.  this is illegal according to rfc2616, but using it is just silly.
	# also, we violate rfc2616 by sending 404 "not found" when the host doesn't exist.
	# we should send 400 "bad request" then, but that is just silly too.
	if(op.cfgs.vhostflag) {
		hostdir: string;
		if(cfg.host != "") {
			hostdir = cfg.host+"!"+cfg.port;
			if(sys->chdir(hostdir) != 0) {
				if(debugflag) say(id, sprint("using hostdir %q from config failed, trying default", hostdir));
				hostdir = nil;
			}
		}
		if(hostdir == nil) {
			hostdir = "_default!"+cfg.port;
			if(sys->chdir(hostdir) != 0)
				return responderrmsg(op, Enotfound, nil);
		}
		if(debugflag) say(id, sprint("using hostdir %q, path %q", hostdir, path));
	}

	validauth := needauth := 0;
	realm: string;
	authtype, cred: string;
	(authtype, cred) = str->splitstrr(req.h.get("authorization"), " ");
	if(str->tolower(authtype) != "basic ")
		cred = nil;
	else
		cred = stripws(cred);
	for(a := cfg.auths; !validauth && a != nil; a = tl a) {
		(apath, arealm, acred) := *hd a;
		if(str->prefix(apath, path)) {
			needauth = 1;
			realm = arealm;
			validauth = cred == acred;
		}
	}
	if(needauth && !validauth) {
		resp.h.add("www-authenticate", sprint("Basic realm=\"%s\"", realm));
		return responderrmsg(op, Eunauthorized, nil);
	}
	if(req.h.has("authorization", nil) && !needauth && cred != credempty) {
		resp.h.add("www-authenticate", sprint("Basic realm=\"authentication not allowed, use empty username/password\""));
		return responderrmsg(op, Eunauthorized, "Not Authorized:  Sending authorization credentials is not allowed for "+
			"this resource.  Please use an empty username and password or do not send authorization credentials altogether.");
	}
	if(debugflag && validauth) say(id, "have valid auth credentials");

	for(r := cfg.redirs; r != nil; r = tl r) {
		repl := hd r;
		(match, dest, replerr) := repl.apply(path);
		if(replerr != nil) {
			warn(id, "redirections misconfiguration: "+replerr);
			return responderrmsg(op, Eservererror, "Internal Server Error: An error occurred while handling a redirection");
		}
		if(!match)
			continue;
		if(!str->prefix("http://", dest) && !str->prefix("https://", dest)) {
			(havehost, hosthdr) := req.h.find("host");
			if(havehost) {
				dest = "http://"+hosthdr+dest;
			} else {
				lport := "";
				if(op.lport != "80")
					lport = ":"+op.lport;
				httphost := op.lhost;
				(ok, ip) := IPaddr.parse(httphost);
				if(ok == 0 && !ip.isv4())
					httphost = "["+httphost+"]";
				dest = "http://"+httphost+lport+dest;
			}
		}
		if(debugflag) say(id, sprint("redirecting from %q to %q", path, dest));
		resp.h.set("location", dest);
		dest = htmlescape(dest);
		st := Emovedpermanently;
		html := mkhtmlstart(sprint("%d - %s", st, statusmsg(st))) +
			sprint("<h1>Moved Permanently: Moved to <a href=\"%s\">%s</a></h1>\n", dest, dest)+"</body></html>\n";
		return respond(op, Emovedpermanently, html, "text/html; charset=utf-8");
	}

	if(((cgipath, cgiaction, methods, cgitype) := findcgi(cfg, path)).t1 != nil) {
		if(methods != nil && !hasmethod(methods, req.methodstr))
			return responderrmsg(op, Emethodnotallowed, nil);
		return cgi(path, op, cgipath, cgiaction, cgitype);
	}

	# path is one of:  plain file, directory (either listing or plain index file)
	dfd := sys->open("."+path, Sys->OREAD);
	if(dfd != nil)
		(dok, dir) := sys->fstat(dfd);
	if(dok == 0 && dir.mode&Sys->DMDIR && path[len path-1] == '/') {
		for(l := cfg.indexfiles; l != nil; l = tl l) {
			ipath := "."+path+hd l;
			(iok, idir) := sys->stat(ipath);
			if(iok != 0 || idir.mode&Sys->DMDIR)
				continue;
			ifd := sys->open(ipath, Sys->OREAD);
			if(ifd == nil)
				return responderrmsg(op, Enotfound, nil);
			if(debugflag) say(id, sprint("using index file %q", hd l));
			dfd = ifd;
			dir = idir;
			path += hd l;
			break;
		}
	}
	if(dfd == nil || dok != 0 || (dir.mode&Sys->DMDIR) && (!dolisting(cfg, path) || path != nil && path[len path-1] != '/'))
		return responderrmsg(op, Enotfound, nil);

	if(req.method == POST) {
		resp.h.add("allow", "GET, HEAD, OPTIONS");
		return responderrmsg(op, Emethodnotallowed, "Method Not Allowed: POST not allowed");
	}

	resp.h.add("last-modified", httpdate(dir.mtime));
	tag := etag(path, op, dir);
	resp.h.add("etag", tag);

	ifmatch, ifnonematch, ifunmodsincestr: string;
	havecond: int;
	(havecond, ifmatch) = req.h.find("if-match");
	if(req.version() >= HTTP_11 && havecond && !etagmatch(req.version(), tag, ifmatch, 1))
		return responderrmsg(op, Epreconditionfailed, sprint("Precondition Failed: Etag(s) \"%s\", specified with If-Match did not match", ifmatch));

	ifmodsince := parsehttpdate(req.h.get("if-modified-since"));
	# http/1.0, head and if-modified-since: rfc1945#8.1;  unsupported date value can safely be ignored.
	if(!(req.version() == HTTP_10 && req.method == HEAD) && ifmodsince && dir.mtime <= ifmodsince)
		return responderr(op, Enotmodified);

	# note: for get this is okay, but for put/delete a bad-syntax value would be have to raise an error
	(havecond, ifnonematch) = req.h.find("if-none-match");
	if(req.version() >= HTTP_11 && havecond && req.method == GET && etagmatch(req.version(), tag, ifnonematch, 0))
		return responderr(op, Enotmodified);

	# unsupported date value causes a "precondition failed"
	(havecond, ifunmodsincestr) = req.h.find("if-unmodified-since");
	ifunmodsince := parsehttpdate(ifunmodsincestr);
	if(req.version() >= HTTP_11 && (ifunmodsince && dir.mtime > ifunmodsince || havecond && ifunmodsince == 0))
		return responderrmsg(op, Epreconditionfailed, sprint("Precondition Failed: Object has been modified since \"%s\"", req.h.get("if-unmodified-since")));

	if(dir.mode&Sys->DMDIR)
		listdir(path, op, dfd);
	else
		plainfile(path, op, dfd, dir, tag);
}

pathsanitize(path: string): string
{
	trailslash := path != nil && path[len path-1] == '/';

	(nil, elems) := sys->tokenize(path, "/");
	r: list of string;
	for(; elems != nil; elems = tl elems)
		if(hd elems == ".")
			continue;
		else if(hd elems == "..") {
			if(r != nil)
				r = tl r;
		} else
			r = hd elems::r;
	s := "";	
	for(; r != nil; r = tl r)
		s = "/"+hd r+s;
	if(trailslash || s == "")
		s += "/";
	return s;
}

findcgi(cfg: ref Cfg, path: string): (string, string, list of string, int)
{
	for(l := cfg.cgipaths; l != nil; l = tl l)
		if(str->prefix((*hd l).t0, path))
			return *hd l;
	return (nil, nil, nil, 0);
}

etag(path: string, op: ref Op, dir: Sys->Dir): string
{
	host := splithost(op.req.h.get("host")).t0;
	if(host == nil)
		host = "_default";
	return "\""+sha1(array of byte sprint("%d,%d,%s,%s,%s", dir.qid.vers, dir.mtime, host, op.lport, path))+"\"";
}

etagmatch(version: int, etag: string, etagstr: string, strong: int): int
{
	if(etagstr == "*")
		return 1;
	(l, err) := tokenizeqs(etagstr, version);
	if(err != nil)
		return 0;
	for(; l != nil; l = tl l)
		if(hd l == etag && (!strong || !str->prefix("W/", hd l)))
			return 1;
	return 0;
}

plainfile(path: string, op: ref Op, dfd: ref Sys->FD, dir: Sys->Dir, tag: string)
{
	id := op.id;
	req := op.req;
	resp := op.resp;

	if(debugflag) say(id, "doing plain file");
	ct := mimetype(op.cfgs, path);
	if(ct != nil)
		resp.h.add("content-type", ct);
	else
		warn(op.id, sprint("could not determine content-type:  host %q path %q query %q", op.req.h.get("host"), op.req.url.path, op.req.url.query));

	# synthetic files sometimes don't have meaningful dir.length.
	# there is no one true way to determine if a file is synthetic.  this is the most reasonable.
	issynthetic := dir.length == big 0 && dir.qid.vers == 0;
	if(issynthetic) {
		op.chunked = resp.version() >= HTTP_11;
	} else {
		op.length = dir.length;
		resp.h.add("content-length", string op.length);
	}

	if(issynthetic && (req.h.has("range", nil) || req.h.has("if-range", nil)))
		return responderrmsg(op, Enotsatisfiable, nil);

	(valid, ranges) := parserange(req.version(), req.h.find("range"), dir.length);
	if(!valid) {
		resp.h.add("content-range", sprint("bytes */%bd", dir.length));
		return responderrmsg(op, Enotsatisfiable, nil);
	}
	bound := "";
	ifrange := req.h.get("if-range");
	# unsupported date value can safely be ignored.
	if(ranges != nil && (ifrange == nil
	                     || ifrange[0] == '"' && tag == ifrange
	                     || dir.mtime <= parsehttpdate(ifrange))) {
		if(len ranges == 1) {
			(start, end) := *hd ranges;
			resp.h.add("content-range", sprint("bytes %bd-%bd/%bd", start, end-big 1, dir.length));
			resp.h.set("content-length", string (end-start));
		} else {
			bound = sha1(array of byte (string <-randch+","+string op.now));
			resp.h.set("content-type", "multipart/byteranges; boundary="+bound);
			resp.h.del("content-length", nil);
			op.chunked = resp.version() >= HTTP_11;
		}
		resp.st = string Epartialcontent;
		resp.stmsg = "Partial Content";
		if(debugflag) say(id, sprint("sending %d ranges for multipart/byterange response", len ranges));
	} else
		ranges = ref (big 0, dir.length)::nil;

	if(gzipallowed(op.cfg.gzpaths, path))
	if(gzipaccepted(req.h))
	if(!issynthetic)
	if(!req.h.find("range").t0)
	if(!req.h.find("if-range").t0)
	if((gzfd := sys->open(gzpath := "."+path+".gz", sys->OREAD)) != nil)
	if(((nil, gzd) := sys->stat(gzpath)).t0 == 0)
	if(gzd.length < dir.length)
	if(gzd.mtime >= dir.mtime) {
		op.length = gzd.length;
		ranges = ref (big 0, gzd.length)::nil;
		resp.h.add("content-encoding", "gzip");
		resp.h.set("content-length", string gzd.length);
		dfd = gzfd;
		dir = gzd;
	}

	if(op.cfg.cachesecs >= 0)
		resp.h.add("cache-control", sprint("max-age=%d", op.cfg.cachesecs));

	accesslog(op);

	rerr := hresp(resp, op.fd, op.keepalive, op.chunked);
	if(rerr != nil)
		die(id, "writing response: "+rerr);

	if(req.method == HEAD)
		return;

	if(issynthetic) {
		buf := array[Sys->ATOMICIO] of byte;
		for(;;) {
			n := sys->readn(dfd, buf, len buf);
			if(n == 0)
				break;
			if(n < 0)
				die(id, sprint("reading file: %r"));
			hwrite(op, buf[:n]);
		}
		hwriteeof(op);
		return;
	}

	for(; ranges != nil; ranges = tl ranges) {
		(off, end) := *hd ranges;
		if(bound != nil) {
			s := sprint("--%s\r\ncontent-type: %s\r\ncontent-range: bytes %bd-%bd/%bd\r\n\r\n",
				bound, ct, off, end-big 1, dir.length);
			hwrite(op, array of byte s);
		}
		while(off < end) {
			want := end-off;
			if(want > big Sys->ATOMICIO)
				want = big Sys->ATOMICIO;
			n := sys->pread(dfd, d := array[int want] of byte, len d, off);
			if(n < 0)
				die(id, sprint("reading file: %r"));
			if(n == 0)
				break;
			off += big n;
			hwrite(op, d[:n]);
		}
		if(bound != nil)
			hwrite(op, array of byte "\r\n");
	}
	hwriteeof(op);
}

gzipallowed(l: list of string, p: string): int
{
	for(; l != nil; l = tl l)
		if(str->prefix(hd l, p))
			return 1;
	return 0;
}

# warning: parsing is simplistic, not handling full http rules, but should be good enough for finding "gzip".
gzipaccepted(h: ref Hdrs): int
{
	for(l := sys->tokenize(h.get("accept-encoding"), ",").t1; l != nil; l = tl l)
		if(strip(str->splitstrl(hd l, ";").t0, " \t") == "gzip")
			return 1;
	return 0;
}

dolisting(cfg: ref Cfg, path: string): int
{
	for(i := 0; i < len cfg.listings; i++) {
		(lpath, what) := *cfg.listings[i];
		if(str->prefix(lpath, path)) {
			say(-1, sprint("listing for path %q: %d, prefix: %q", path, what, lpath));
			return what;
		}
	}
	return 0;
}

listdir(path: string, op: ref Op, dfd: ref Sys->FD)
{
	id := op.id;
	req := op.req;
	resp := op.resp;

	if(debugflag) say(id, "doing directory listing");
	resp.h.add("content-type", "text/html; charset=utf-8");
	op.chunked = resp.version() >= HTTP_11;

	if(op.cfg.cachesecs >= 0)
		resp.h.add("cache-control", sprint("max-age=%d", op.cfg.cachesecs));

	accesslog(op);

	rerr := hresp(resp, op.fd, op.keepalive, op.chunked);
	if(rerr != nil)
		die(id, "writing response: "+rerr);

	if(req.method == HEAD)
		return;

	begin := mkhtmlstart("listing for "+path) + sprint("<h1>listing for %s</h1><hr/><table><tr><th>last modified</th><th>size</th><th>name</th></tr>\n", pathurls(path));
	hwrite(op, array of byte begin);
	for(;;) {
		(nd, d) := sys->dirread(dfd);
		if(nd < 0)
			die(id, sprint("reading dir: %r"));
		if(nd == 0)
			break;
		html := "";
		for(i := 0; i < nd && i < len d; i++) {
			name := d[i].name;
			if(d[i].mode & Sys->DMDIR)
				name += "/";
			html += sprint("<tr><td class=\"mtime\">%s</td><td class=\"size\">%bd</td><td class=\"name\"><a href=\"%s\">%s</a></td></tr>\n", daytime->filet(op.now, d[i].mtime), d[i].length, htmlescape(encodepath("./"+name)), htmlescape(name));
		}
		hwrite(op, array of byte html);
	}
	end := sprint("</table><hr/></body></html>\n");
	hwrite(op, array of byte end);
	hwriteeof(op);
}

mkhtmlstart(msg: string): string
{
	return sprint("<html><head>\n<style type=\"text/css\">\nh1 { font-size: 1.4em; }\ntd, th { padding-left: 1em; padding-right: 1em; }\ntd.mtime, td.size { text-align: right; }\n</style>\n<title>%s</title>\n</head><body>\n", htmlescape(msg));
}

mkhtml(msg: string): string
{
	return mkhtmlstart(msg)+sprint("\n<h1>%s</h1>\n</body></html>\n", htmlescape(msg));
}

htmlescape(s: string): string
{
	r := "";
	for(i := 0; i < len s; i++)
		case s[i] {
		'<' =>	r += "&lt;";
		'>' =>	r += "&gt;";
		'&' =>	r += "&amp;";
		'"' =>	r += "&quot;";
		* =>	r += s[i:i+1];
		}
	return r;
}

pathurls(s: string): string
{
	(nil, l) := sys->tokenize(s, "/");
	r := "";
	i := 0;
	path := "./";
	for(l = rev(l); l != nil; l = tl l) {
		r = sprint(" <a href=\"%s\">%s/</a>", path, htmlescape(hd l))+r;
		if(i == 0)
			path = "../";
		else
			path += "../";
		i += 1;
	}
	r = sprint("<a href=\"%s\">/</a>", path)+r;
	return r;
}

cgi(path: string, op: ref Op, cgipath, cgiaction: string, cgitype: int)
{
	id := op.id;
	req := op.req;

	if(debugflag) say(id, sprint("passing to (s)cgi handler, cgipath %q cgiaction %q", cgipath, cgiaction));

	# first, some sanity checks on the request
	# parsing/handling full transfer-coding is too involved for us.
	# we are taking a short cut here to avoid feeding the bloat monster.
	length := big 0;
	needcontinue := 0;
	if(req.method == POST) {
		transferenc := req.h.getlist("transfer-encoding");
		if(req.version() >= HTTP_11 && transferenc != nil && transferenc != "identity")
			return responderrmsg(op, Enotimplemented, "Not Implemented: Transfer-Encodings other than \"identity\" "+
				"(i.e. no transfer encoding) are not supported");

		if(req.h.has("content-length", nil)) {
			lengthstr := req.h.get("content-length");
			if(lengthstr == nil || str->drop(lengthstr, "0-9") != "")
				return responderrmsg(op, Ebadrequest,
					sprint("Bad Request: Invalid Content-Length: \"%s\"", lengthstr));
			length = big lengthstr;
		} else {
			(e, emsg) := (Elengthrequired, "");
			if(req.version() == HTTP_10) # rfc1945#7.2.2
				(e, emsg) = (Ebadrequest, "Bad Request: Missing header \"Content-Length\"");
			return responderrmsg(op, e, emsg);
		}

		contentenc := req.h.getlist("content-encoding");
		if(contentenc != nil && contentenc != "identity")
			return responderrmsg(op, Enotimplemented, "Not Implemented: Content-Encoding other than identity "+
				"(i.e. no content encoding) are not supported");

		needcontinue = req.version() >= HTTP_11 && req.h.has("expect", nil);
		if(needcontinue && (expect := str->tolower(req.h.getlist("expect"))) != "100-continue")
			return responderrmsg(op, Eexpectationfailed,
				sprint("Expectectation Failed: Unrecognized expectation:  %s", expect));

		if(debugflag) say(id, sprint("post, client content-length %bd", length));
	}

	timeo := Cgitimeoutsecs*1000;
	donech := chan of int;

	spawn timeout(op, timeo, timeoch := chan of int, donech);
	timeopid := <- timeoch;
	if(timeopid < 0)
		die(op.id, "timeout proc failed");
	spawn cgiproc(path, op, cgipath, cgiaction, cgitype, length, needcontinue, timeopid, timeoch, donech);

	# wait for timeout or cgiproc
	<-donech;
	return;
}

timeout(op: ref Op, timeo: int, timeoch, donech: chan of int)
{
	pid := sys->pctl(Sys->NEWPGRP, nil);
	timeoch <-= pid;
	if(pid < 0)
		return warn(op.id, sprint("pctl: %r"));
		
	opid := <-timeoch;
	sys->sleep(timeo);
	if(debugflag) say(op.id, sprint("timeout %d ms for request, killing handler pid %d, timeopid %d", timeo, opid, pid));
	killch <-= opid;
	responderrmsg(op, Eservererror, "Internal Server Error: Response could not be generated in time");
	donech <-= 0;
}

cgiproc(path: string, op: ref Op, cgipath, cgiaction: string, cgitype: int, length: big, needcontinue: int, timeopid: int, cgich, donech: chan of int)
{
	# set up new process group and exception propagation so
	# we always clean up nicely when one of the child procs dies.
	# we always have to respond on donech (or be killed by the timeout
	# proc) or we'll leave processes lingering
	err: string;
	npid := sys->pctl(Sys->NEWPGRP, nil);
	if(npid < 0)
		err = sprint("pctl newpgrp: %r");
	if(err == nil) {
		excch <-= (npid, respch := chan of string);
		err = <-respch;
	}

	if(err != nil) {
		killch <-= timeopid;
		warn(op.id, err);
		responderrmsg(op, Eservererror, nil);
		donech <-= 0;
		return;
	}

	# to make sure our caller can return (e.g. when writing to remote fails)
	{
		_cgiproc(path, op, cgipath, cgiaction, cgitype, length, needcontinue, timeopid, cgich);
	} exception {
	* =>	killch <-= timeopid;	# may already have been killed
	}
	donech <-= 0;
}

# note: this function must always kill the timeout proc on "normal" returns (i.e. without raising an exception).
_cgiproc(path: string, op: ref Op, cgipath, cgiaction: string, cgitype: int, length: big, needcontinue: int, timeopid: int, cgich: chan of int)
{
	# pid ends up in timeout(), this proc is killed if it doesn't respond timely
	pid := sys->pctl(0, nil);
	cgich <-= pid;

	id := op.id;
	req := op.req;
	resp := op.resp;

	if(debugflag) say(id, sprint("handling cgi request, cgipath %q cgiaction %q cgitype %s, pid %d timeopid %d", cgipath, cgiaction, cgitypes[cgitype], pid, timeopid));

	fd0, fd1: ref Sys->FD;
	if(cgitype == Scgi) {
		scgidialch <-= (cgiaction, replychan := chan of (ref Sys->FD, string));
		(sfd, serr) := <-replychan;
		if(serr != nil) {
			warn(op.id, serr);
			killch <-= timeopid;
			return responderrmsg(op, Eservererror, "Internal Server Error: Handler not reachable");
		}

		sreq := scgirequest(path, cgipath, req, op, length);
		if(sys->write(sfd, sreq, len sreq) != len sreq) {
			warn(id, sprint("write scgi request: %r"));
			killch <-= timeopid;
			return responderrmsg(op, Eservererror, nil);
		}
		fd0 = fd1 = sfd;
	} else {
		err: string;
		cgispawnch <-= (cgiaction, path, cgipath, op, length, replych := chan of (ref Sys->FD, ref Sys->FD, string));
		(fd0, fd1, err) = <-replych;
		if(err != nil) {
			warn(id, "cgispawn: "+err);
			killch <-= timeopid;
			return responderrmsg(op, Eservererror, nil);
		}
	}

	sb := bufio->fopen(fd1, Bufio->OREAD);
	if(sb == nil) {
		warn(id, sprint("bufio fopen cgi fd: %r"));
		killch <-= timeopid;
		return responderrmsg(op, Eservererror, nil);
	}

	if(length > big 0)
		spawn cgifunnel(op.id, op.inb, fd0, length);

	# we always want a "status: ..." line from the cgi program.  it would be better if we would
	# generate a "200 ok" if the status is missing, but we cannot parse the full http request
	# after we've already read the first line (with a header in it) from the iobuf...

	rerr: string;
	hdrs: ref Hdrs;
	for(;;) {
		l := sb.gets('\n');
		killch <-= timeopid;
		if(l == nil) {
			warn(id, "eof from cgi handler while reading response line");
			return responderrmsg(op, Eservererror, "Internal Server Error: EOF from handler");
		}
		l = l[:len l-1];
		if(l != nil && l[len l-1] == '\r')
			l = l[:len l-1];

		if(!str->prefix("status:", str->tolower(l))) {
			warn(id, sprint("bad cgi response line: %q", l));
			return responderrmsg(op, Eservererror, "Internal Server Error: Handler sent bad response line");
		}
		l = str->drop(l[len "status:":], " \t");
		(resp.st, resp.stmsg) = str->splitstrl(l, " ");
		if(resp.stmsg != nil)
			resp.stmsg = droptl(resp.stmsg[1:], " \t");
		if(len resp.st != 3 || str->drop(resp.st, "0-9") != "") {
			warn(id, sprint("bad cgi response line: %q", l));
			return responderrmsg(op, Eservererror, "Internal Server Error: Handler sent bad response line");
		}

		(hdrs, rerr) = Hdrs.read(sb);
		if(rerr != nil) {
			warn(id, "reading cgi headers: "+rerr);
			return responderrmsg(op, Eservererror, "Internal Server Error: Error reading headers from handler");
		}

		if(resp.st == "100") {
			needcontinue = 0;
			fprint(op.fd, "HTTP/1.1 100 Continue\r\n\r\n");
			continue;
		}
		if(needcontinue)
			fprint(op.fd, "HTTP/1.1 100 Continue\r\n\r\n");
		break;
	}

	elength := big -1;
	if(hdrs.has("content-length", nil)) {
		elengthstr := hdrs.get("content-length");
		if(elengthstr == nil || str->drop(elengthstr, "0-9") != "") {
			warn(id, sprint("bad cgi content-length header: %q", elengthstr));
			return responderrmsg(op, Eservererror, "Internal Server Error: Invalid content-length from handler");
		}
		op.length = elength = big elengthstr;
	}
	for(hl := hdrs.all(); hl != nil; hl = tl hl)
		resp.h.add((hd hl).t0, (hd hl).t1);

	accesslog(op);

	op.chunked = elength == big -1 && resp.version() >= HTTP_11;
	rerr = hresp(resp, op.fd, op.keepalive, op.chunked);
	if(rerr != nil) {
		warn(id, "writing response: "+rerr);
		return;
	}

	if(req.method == HEAD)
		return;

	for(;;) {
		n := sb.read(d := array[Sys->ATOMICIO] of byte, len d);
		if(n < 0)
			die(id, sprint("reading file: %r"));
		if(n == 0) {
			if(elength > big 0)
				die(id, "bad cgi body, message shorter than content-length specified");
			break;
		}
		if(elength > big 0) {
			if(big n > elength)
				die(id, "bad cgi body, message longer than content-length specified");
			elength -= big n;
		}
		# for last bit of data, verify that the handler is finished writing
		if(elength > big n || (big n == elength && sb.read(tmp := array[1] of byte, len tmp) != 0))
			die(id, "bad cgi body, message longer than content-length specified");
		hwrite(op, d[:n]);
	}
	hwriteeof(op);
	if(debugflag) say(id, "request done");
}

cgifunnel(id: int, b: ref Iobuf, sfd: ref Sys->FD, length: big)
{
	while(length > big 0) {
		need := Sys->ATOMICIO;
		if(big need > length)
			need = int length;
		n := b.read(d := array[need] of byte, len d);
		if(n < 0)
			die(id, sprint("cgi read: %r"));
		if(n == 0)
			die(id, "cgi read: premature eof");
		{
			if(sys->write(sfd, d, n) != n)
				die(id, sprint("cgi write: %r"));
		} exception {
		* =>	die(id, sprint("cgi write: write on broken pipe"));
		}
		length -= big n;
	}
}

cgivars(path, cgipath: string, op: ref Op, length: big, environ: list of (string, string)): list of (string, string)
{
	servername := op.req.h.get("host");
	if(servername == nil)
		servername = op.lhost;
	pathinfo := path[len cgipath:];
	query := op.req.url.query;
	if(query != nil)
		query = query[1:];
	return	("CONTENT_LENGTH",	string length)::
		("GATEWAY_INTERFACE",	"CGI/1.1")::
		("SERVER_PROTOCOL",	http->versionstr(op.req.version()))::
		("SERVER_NAME",		servername)::
		("REQUEST_METHOD",	op.req.methodstr)::
		("REQUEST_URI",		op.req.url.packpath())::
		("SCRIPT_NAME",		cgipath)::
		("PATH_INFO",		pathinfo)::
		("PATH_TRANSLATED",	pathinfo)::
		("QUERY_STRING",	query)::
		("SERVER_ADDR",		op.lhost)::
		("SERVER_PORT",		op.lport)::
		("REMOTE_ADDR",		op.rhost)::
		("REMOTE_PORT",		op.rport)::
		("SERVER_SOFTWARE",	Version)::
		environ;
}

scgirequest(path, scgipath: string, req: ref Req, op: ref Op, length: big): array of byte
{
	l := ("SCGI", "1")::cgivars(path, scgipath, op, length, environment);
	s := "";
	for(h := l; h != nil; h = tl h)
		s += (hd h).t0+"\0"+(hd h).t1+"\0";
	for(h = req.h.all(); h != nil; h = tl h)
		s += cgivar((hd h).t0)+"\0"+(hd h).t1+"\0";
	return netstring(s);
}

cgivar(s: string): string
{
	r := "HTTP_";
	for(i := 0; i < len s; i++)
		if(s[i] != '-')
			r[len r] = s[i];
		else
			r[len r] = '_';
	return str->toupper(r);
}

netstring(s: string): array of byte
{
	return array of byte (sprint("%d:", len s)+s+",");
}


hresp(resp: ref Resp, fd: ref Sys->FD, keepalive, chunked: int): string
{
	if(keepalive)
		resp.h.add("connection", "keep-alive");
	else
		resp.h.add("connection", "close");
	if(chunked) {
		resp.h.add("transfer-encoding", "chunked");
		resp.h.del("content-length", nil);
	}
	return resp.write(fd);
}

hwrite(op: ref Op, d: array of byte)
{
	if(len d == 0)
		return;

	if(op.chunked) {
		length := array of byte sprint("%x\r\n", len d);
		nd := array[len length+len d+2] of byte;
		nd[:] = length;
		nd[len length:] = d;
		nd[len length+len d:] = array of byte "\r\n";
		d = nd;
	}
	if(sys->write(op.fd, d, len d) != len d)
		die(op.id, sprint("writing response data: %r"));
}

hwriteeof(op: ref Op)
{
	if(op.chunked)
		fprint(op.fd, "0\r\n\r\n");
}

respond(op: ref Op, st: int, errmsgstr: string, ct: string)
{
	resp := op.resp;
	resp.st = string st;
	resp.stmsg = statusmsg(st);
	if(ct != nil)
		resp.h.set("content-type", ct);

	op.chunked = 0;
	errmsg := array of byte errmsgstr;
	op.length = big len errmsg;
	if(!(st >= 100 && st < 200 || st == 204 || st == 304))
		resp.h.set("content-length", string op.length);

	err := hresp(resp, op.fd, op.keepalive, op.chunked);
	if(err != nil)
		die(op.id, "writing error response: "+err);

	if(errmsgstr != nil && (op.req == nil || op.req.method != HEAD)) {
		hwrite(op, errmsg);
		hwriteeof(op);
	}

	accesslog(op);
}

responderr(op: ref Op, st: int)
{
	return respond(op, st, nil, nil);
}

responderrmsg(op: ref Op, st: int, errmsg: string)
{
	if(errmsg == nil)
		errmsg = statusmsg(st);
	return respond(op, st, mkhtml(sprint("%d - %s", st, errmsg)), "text/html; charset=utf-8");
}

statusmsg(code: int): string
{
	for(i := 0; i < len statusmsgs && statusmsgs[i].t0 <= code; i++)
		if(code == statusmsgs[i].t0)
			return statusmsgs[i].t1;
	raise sprint("missing status message for code %d", code);
}

dnslookup(dnsch: chan of string, respch: chan of (string, string))
{
	path := "/net/dns";
	for(;;) {
		ip := <-dnsch;

		revip, err: string;
		l: list of string;
		fd := sys->open(path, Sys->ORDWR);
		if(fd == nil) {
			err = sprint("open %q: %r", path);
		} else {
			(l, err) = reversedns(fd, ip);
			if(len l > 1)
				err = "too many results";
			else if(len l == 0 && err == nil)
				err = "no results";
			else if(len l == 1)
				revip = hd l;
			
		}
		respch <-= (revip, err);
	}
}

reversedns(fd: ref Sys->FD, ip: string): (list of string, string)
{
	(nil, l) := sys->tokenize(ip, ".");
	if(len l != 4)
		return (nil, "invalid ip address");
	dst := "";
	for(; l != nil; l = tl l)
		dst = hd l+"."+dst;
	dst += "in-addr.arpa";
	if(fprint(fd, "%s ptr", dst) < 0)
		return (nil, sprint("%r"));
	r: list of string;
	for(;;) {
		have := sys->read(fd, d := array[1024] of byte, len d);
		if(have < 0)
			return (nil, sprint("read: %r"));
		if(have == 0)
			break;
		(nil, l) = sys->tokenize(string d[:have], " \t");
		if(len l != 3 || hd tl l != "ptr" || hd l != dst)
			continue;
		r = (hd tl tl l)::r;
	}
	return (r, nil);
}

logger()
{
	accessfd: ref Sys->FD;
	backlog := array[0] of (string, string);

	ip, msg: string;
	respch := chan of (string, string);
	dnsch := chan of string;

	spawn dnslookup(dnsch, respch);

	for(;;) alt {
	(logip, s) := <-logch =>
		if(accessfd == nil)
			continue;
		if(msg != nil) {
			na := array[len backlog+1] of (string, string);
			na[:] = backlog;
			na[len backlog] = (logip, s);
			backlog = na;
		} else {
			msg = s;
			ip = logip;
			dnsch <-= logip;
		}

	(revip, err) := <-respch =>
		if(err != nil)
			say(0, sprint("reverse dns lookup %q: %s", ip, err));
		if(fprint(accessfd, "%s %q\n", msg, revip) < 0)
			warn(0, sprint("writing access log message: %r"));
		msg = nil;
		if(len backlog != 0) {
			(ip, msg) = backlog[0];
			backlog = backlog[1:];
			dnsch <-= ip;
		}

	accessfd = <-logfdch =>
		;
	}
}

accesslog(op: ref Op)
{
	if(op.cfgs.accessfd == nil && !debugflag)
		return;

	length := "";
	if(!op.chunked && op.length >= big 0)
		length = string op.length;

	s := sprint("%d %d %s!%s %s!%s %q %q %q HTTP/%d.%d %q %q %q %q %q",
		op.id, op.now,
		op.rhost, op.rport, op.lhost, op.lport,
		op.req.methodstr, op.req.h.get("host"), op.req.url.path+op.req.url.query,
		op.req.major, op.req.minor, op.resp.st, op.resp.stmsg,
		length,
		op.req.h.get("user-agent"), op.req.h.get("referer"));
	logch <-= (op.rhost, s);
	if(debugflag) say(op.id, "accesslog: "+s);
}

splithost(s: string): (string, string)
{
	host: string;
	if(str->prefix("[", s)) {
		# "[ip6]"
		(ip, rem) := str->splitstrl(s[1:], "]");
		if(!str->prefix("]", rem))
			return (nil, nil);
		s = rem[1:];
		(ok, ipaddr) := IPaddr.parse(ip);
		if(ok != 0)
			return (nil, nil);
		# canonical form, eg for ipv4 mapped on ipv6
		host = ipaddr.text();
	} else
		(host, s) = str->splitstrl(s, ":");
	if(str->prefix(":", s))
		s = s[1:];
	return (host, s);
}

suffix(suf, s: string): int
{
	if(len suf > len s)
		return 0;
	return suf == s[len s-len suf:];
}

mimetype(cfgs: ref Cfgs, path: string): string
{
	for(t := cfgs.usertypes; t != nil; t = tl t)
		if(suffix((hd t).t0, path))
			return (hd t).t1;
	for(i := 0; i < len mimetypes; i++)
		if(suffix(mimetypes[i].t0, path))
			return mimetypes[i].t1;
	if(!haschar(str->splitstrr(path, "/").t1, '.'))
		return "text/plain; charset=utf-8";	# for mkfile, README, etc.
	return nil;
}

hasbody(req: ref Req): int
{
	return req.h.has("content-length", nil) || req.h.has("transfer-encoding", nil);
}

days := array[] of {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
months := array[] of {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

httpdate(t: int): string
{
	tm := daytime->gmt(t);
	return sprint("%s, %02d %s %d %02d:%02d:%02d GMT", days[tm.wday], tm.mday, months[tm.mon], tm.year+1900, tm.hour, tm.min, tm.sec);
}

readtoken(s: string): (string, string, string)
{
	for(i := 0; i < len s; i++)
		if(s[i] < ' ')
			return (nil, nil, "invalid control characters found");
		else if(str->in(s[i], "()<>@,;:\\\"/[]?={} \t"))
			break;
	return (s[:i], s[i:], nil);
}

# read list of bare tokens
tokenize(s: string): (list of string, string)
{
	token, err: string;
	l: list of string;
	for(;;) {
		(token, s, err) = readtoken(s);
		if(err != nil)
			return (nil, err);
		if(token != nil)
			l = token::l;
		s = str->drop(s, " \t");
		if(s == nil)
			break;
		if(s[0] != ',')
			return (nil, "expected comma as separator");
		s = str->drop(s, ", \t");
	}
	return (rev(l), nil);
}

# read double quoted token in header.
# for http/1.1 a backslash may be used for escaping, not for http/1.0
readqs(s: string, v: int): (string, string, string)
{
	if(s == nil)
		return (nil, nil, nil);
	if(s[0] != '"')
		return (nil, s, nil);
	r := "\"";
	for(i := 1; i < len s; i++)
		if(s[i] < ' ')
			return (nil, nil, "invalid control character found inside quoted string");
		else if(v >= HTTP_11 && s[i] == '\\' && i+1 < len s && s[i+1] == '"')
			r[len r] = s[++i];
		else {
			r[len r] = s[i];
			if(s[i] == '"')
				return (r, s[i+1:], nil);
		}
	return (nil, nil, "quoted string not ended");
}

# read list of double-quoted strings
tokenizeqs(s: string, v: int): (list of string, string)
{
	r: list of string;
	qs, err: string;
	for(;;) {
		(qs, s, err) = readqs(s, v);
		if(err != nil)
			return (nil, err);
		if(qs != nil)
			r = qs::r;
		s = str->drop(s, " \t");
		if(s == nil)
			break;
		if(s[0] != ',')
			return (nil, "expected comma as separator");
		s = str->drop(s, ", \t");
	}
	return (rev(r), nil);
}

# i'm not going to parse three different date formats where a simple unix epoch integer would have sufficed.
# death to the bloat monster!
parsehttpdate(s: string): int
{
	mday, mon, year, hour, min, sec: int;

	# sys-tokenize allows too much whitespace, but well...
	(n, tokens) := sys->tokenize(s, " ");
	if(n != 6 || len hd tokens != 4 || (hd tokens)[3] != ',' || index(days, (hd tokens)[:3]) < 0)
		return 0;
	if((mon = index(months, hd tl tl tokens)) < 0)
		return 0;
	(hn, htokens) := sys->tokenize(hd tl tl tl tl tokens, ":");
	if(hn != 3)
		return 0;
	mday = int hd tl tokens;
	year = int hd tl tl tl tokens;
	hour = int hd htokens;
	min = int hd tl htokens;
	sec = int hd tl tl htokens;

	# last arg should be seconds offset for timezone, "luckily" http allows only gmt...
	return daytime->tm2epoch(ref Daytime->Tm(sec, min, hour, mday, mon, year-1900, 0, 0, s[1:], 0));
}

parserange(version: int, rangehdr: (int, string), length: big): (int, list of ref (big, big))
{
	(haverange, range) := rangehdr;
	if(!haverange || !(version >= HTTP_11))
		return (1, nil);

	if(!str->prefix("bytes", range))
		return (0, nil);
	range = range[len "bytes":];
	range = str->drop(range, " \t");
	if(!str->prefix("=", range))
		return (0, nil);
	range = str->drop(range[1:], " \t");

	# warning: range header parsing is fairly abstruse
	r: list of ref (big, big);
	valid := 0;
	for(l := sys->tokenize(range, ",").t1; l != nil; l = tl l) {
		s := strip(hd l, " \t");
		if(s == nil)
			continue;
		if(s[0] == '-') {
			# single (negative) byte offset relative to end of file
			s = str->drop(s[1:], " \t");
			if(s == nil || str->drop(s, "0-9") != nil)
				return (1, nil);
			if(big s != big 0)
				valid = 1;
			i := length - big s;
			if(i < big 0)
				i = big 0;
			if(i >= length)
				i = length - big 1;
			r = ref (i, length)::r;
		} else {
			(first, last) := str->splitstrl(s, "-");
			if(stripws(str->drop(first, "0-9")) != nil || last == nil || str->drop(stripws(last[1:]), "0-9") != nil)
				return (1, nil);
			f := big first;
			e := length;
			last = stripws(last[1:]);
			if(last != nil)
				e = big last+big 1;
			if(e > length)
				e = length;
			if(f > e)
				return (1, nil);
			if(f < length)
				valid = 1;
			r = ref (f, e)::r;
		}
	}
	return (valid, rev(r));
}

listingssort(cfg: ref Cfg)
{
	sort(cfg.listings, listingge);
}

sort[T](a: array of T, ge: ref fn(a, b: T): int)
{
	for(i := 1; i < len a; i++) {
		tmp := a[i];
		for(j := i; j > 0 && ge(a[j-1], tmp); j--)
			a[j] = a[j-1];
		a[j] = tmp;
	}
}

listingge(e1, e2: ref (string, int)): int
{
	return len e1.t0 < len e2.t0;
}

strip(s, cl: string): string
{
	return droptl(str->drop(s, cl), cl);
}

stripws(s: string): string
{
	return strip(s, " \t");
}

droptl(s, cl: string): string
{
	while(s != nil && str->in(s[len s-1], cl))
		s = s[:len s-1];
	return s;
}

index(a: array of string, s: string): int
{
	for(i := 0; i < len a; i++)
		if(a[i] == s)
			return i;
	return -1;
}

readaddr(id: int, path: string): (string, string)
{
	(s, err) := readfileline(path, 256);
	if(err != nil)
		die(id, err);
	(lhost, lport) := str->splitstrl(s, "!");
	if(lport != nil)
		lport = lport[1:];
	return (lhost, lport);
}

readfileline(path: string, maxsize: int): (string, string)
{
	fd := sys->open(path, Sys->OREAD);
	if(fd == nil)
		return (nil, sprint("open %s: %r", path));
	n := sys->read(fd, buf := array[maxsize] of byte, len buf);
	if(n < 0)
		return (nil, sprint("read %s: %r", path));
	s := string buf[:n];
	if(s != nil && s[len s-1] == '\n')
		s = s[:len s-1];
	return (s, nil);
}

readtime(): int
{
	n := sys->pread(timefd, d := array[64] of byte, len d, big 0);
	if(n < 0)
		fail(sprint("reading time: %r"));
	return int ((big string d[:n])/big 1000000);
}

byte2str(a: array of byte): string
{
	s := "";
	for(i := 0; i < len a; i++)
		s += sprint("%02x", int a[i]);
	return s;
}

sha1(a: array of byte): string
{
	r := array[keyring->SHA1dlen] of byte;
	keyring->sha1(a, len a, r, nil);
	return byte2str(r);
}

listhas(l: list of string, s: string): int
{
	for(; l != nil; l = tl l)
		if(str->tolower(hd l) == s)
			return 1;
	return 0;
}

haschar(s: string, c: int): int
{
	for(i := 0; i < len s; i++)
		if(s[i] == c)
			return 1;
	return 0;
}

hasmethod(l: list of string, v: string): int
{
	for(; l != nil; l = tl l)
		if(hd l == v)
			return 1;
	return 0;
}

substr(sub, s: string): int
{
	return str->prefix(sub, str->splitstrl(s, sub).t1);
}

rev[T](l: list of T): list of T
{
	r: list of T;
	for(; l != nil; l = tl l)
		r = hd l::r;
	return r;
}

kill(pid: int)
{
	fd := sys->open(sprint("/prog/%d/ctl", pid), Sys->OWRITE);
	if(fd != nil)
		fprint(fd, "kill");
}

say(id:int, s: string)
{
	msec := sys->millisec();
	if(debugflag)
		fprint(fildes(2), "%d %d, %s\n", msec, id, s);
	if(debugflag && errorfd != nil)
		fprint(errorfd, "%d %d, %s\n", msec, id, s);
}

warn(id: int, s: string)
{
	msec := sys->millisec();
	if(debugflag)
		fprint(fildes(2), "%d %d, %s\n", msec, id, s);
	if(errorfd != nil)
		fprint(errorfd, "%d %d, %s\n", msec, id, s);
}

die(id: int, s: string)
{
	warn(id, s);
	raise "fail:"+s;
}

fail(s: string)
{
	fprint(fildes(2), "%s\n", s);
	raise "fail:"+s;
}


# reading the config file

Cfgs.init(file: string): (ref Cfgs, string)
{
	db := Db.open(file);
	if(db == nil)
		return (nil, sprint("open config %q: %r", file));
	return Cfgs.read(file, db);
}

Cfgs.read(file: string, db: ref Db): (ref Cfgs, string)
{
	c := ref Cfgs(file, db, Cfg.new(), nil, nil, 0, 0, nil, nil);
	logfile: string;

	e: ref Dbentry; 
	(e, nil) = c.db.find(nil, "vhost");
	if(e != nil)
		c.vhostflag = 1;
	(e, nil) = c.db.find(nil, "novhost");
	if(e != nil)
		c.vhostflag = 0;

	(e, nil) = c.db.find(nil, "debug");
	if(e != nil)
		c.debugflag = 1;
	(e, nil) = c.db.find(nil, "nodebug");
	if(e != nil)
		c.debugflag = 0;

	(e, nil) = c.db.find(nil, "ctlchan");
	if(e != nil) {
		s := e.findfirst("ctlchan");
		if(s != nil)
			ctlchan = s;
	}

	(e, nil) = c.db.find(nil, "accesslog");
	if(e != nil) {
		s := e.findfirst("accesslog");
		if(s != nil)
			logfile = s;
	}

	ptr: ref Attrdb->Dbptr;
	attr := "mime";
	for(;;) {
		(e, ptr) = c.db.find(ptr, attr);
		if(e == nil)
			break;
		ext := e.findfirst("ext");
		mtype := e.findfirst("type");
		if(ext == nil || mtype == nil)
			return (nil, sprint("bad mime type, ext=%q type=%q", ext, mtype));
		c.usertypes = ref (ext, mtype)::c.usertypes;
	}
	ptr = nil;

	attr = "announce";
	for(;;) {
		(e, ptr) = c.db.find(ptr, attr);
		if(e == nil)
			break;
		c.addrs = e.findfirst("announce")::c.addrs;
	}
	ptr = nil;

	attr = "host";
	for(;;) {
		(e, ptr) = c.db.find(ptr, attr);
		if(e == nil)
			break;
		host := e.findfirst("host");
		port := e.findfirst("port");
		if(port == nil)
			port = "80";
		(cfg, err) := Cfg.read(e, port);
		if(err != nil)
			return (nil, err);
		if(host == "*")
			host = "";
		cfg.host = host;
		cfg.port = string int port;
		if(host == nil)
			c.default = cfg;
		c.cfgs = (host, port, cfg)::c.cfgs;
	}
	ptr = nil;

	attr = "alias";
	for(;;) {
		(e, ptr) = c.db.find(ptr, attr);
		if(e == nil)
			break;
		host := e.findfirst("host");
		port := e.findfirst("port");
		usehost := e.findfirst("usehost");
		useport := e.findfirst("useport");
		if(port == nil)
			port = "80";
		if(usehost == nil)
			usehost = host;
		if(useport == nil)
			useport = port;
		if(usehost == host && useport == port)
			return (nil, "alias line aliases host and port to itself, ignoring");
		cfg := c.find(usehost, string int useport);
		if(cfg == nil)
			return (nil, sprint("alias references non-existing usehost=%q useport=%q", usehost, useport));
		c.cfgs = (host, string int port, cfg)::c.cfgs;
	}
	ptr = nil;

	if(logfile != nil) {
		c.accessfd = sys->open(logfile, Sys->OWRITE);
		if(c.accessfd == nil)
			return (nil, sprint("open logfile %q: %r", logfile));
		sys->seek(c.accessfd, big 0, Sys->SEEKEND);
	}
	c.usertypes = rev(c.usertypes);

	return (c, nil);
}

Cfgs.find(c: self ref Cfgs, host, port: string): ref Cfg
{
	for(l := c.cfgs; l != nil; l = tl l) {
		(chost, cport, config) := hd l;
		if(host == chost && port == cport)
			return config;
	}
	return c.default;
}


Cfg.new(): ref Cfg
{
	return ref Cfg("", "80", array[0] of ref (string, int), -1, nil, nil, nil, nil, nil, nil);
}

Cfg.read(e: ref Dbentry, defaultport: string): (ref Cfg, string)
{
	cfg := Cfg.new();

	for(l := list of {"cachesecs"}; l != nil; l = tl l) {
		for(r := e.find(hd l); r != nil; r = tl r) {
			for(attrs := (hd r).t1; attrs != nil; attrs = tl attrs) {
				val := (hd attrs).val;
				case (hd attrs).attr {
				"cachesecs" =>
					cfg.cachesecs = int val;
				* =>
					warn(0, sprint("ignoring config attribute %q", (hd attrs).attr));
				}
			}
		}
	}

	for(l = list of {"listings", "nolistings", "listen", "redir", "auth", "index", "cgi", "scgi", "gzip"}; l != nil; l = tl l) {
		attr := hd l;
		for(r := e.find(attr); r != nil; r = tl r) {
			(tups, nil) := hd r;
			case attr {
			"listings" or "nolistings" =>
				what := attr == "listings";
				for(pl := tups.find("path"); pl != nil; pl = tl pl) {
					nl := array[len cfg.listings+1] of ref (string, int);
					nl[:] = cfg.listings;
					nl[len cfg.listings] = ref ((hd pl).val, what);
					cfg.listings = nl;
				}

			"listen" =>
				ip := tups.find("ip");
				port := tups.find("port");
				if(ip == nil)
					return (nil, sprint("missing ip in listen line"));
				ipstr := (hd ip).val;
				(ok, ipaddr) := IPaddr.parse(ipstr);
				if(ok != 0)
					return (nil, sprint("invalid ip address: %q", ipstr));
				portstr := defaultport;
				if(port != nil)
					portstr = (hd port).val;
				cfg.listens = (ref (ipaddr.text(), string int portstr))::cfg.listens;

			"redir" =>
				src := tups.find("src");
				dst := tups.find("dst");
				if(src == nil || dst == nil)
					return (nil, "missing src or dst in redir line");
				(repl, rerr) := Repl.parse((hd src).val, (hd dst).val);
				if(rerr != nil)
					return (nil, "parsing redir: "+rerr);
				cfg.redirs = repl::cfg.redirs;

			"auth" =>
				path := tups.find("path");
				realm := tups.find("realm");
				user := tups.find("user");
				pass := tups.find("pass");
				if(path == nil || realm == nil || user == nil || pass == nil)
					return (nil, "missing field in auth line, need path, realm, user and pass");
				if(haschar((hd realm).val, '"'))
					return (nil, "realm must not have double quote, not supported by http/1.0");
				cfg.auths = ref ((hd path).val, (hd realm).val, base64->enc(array of byte ((hd user).val+":"+(hd pass).val)))::cfg.auths;

			"index" =>
				for(file := tups.find("file"); file != nil; file = tl file)
					cfg.indexfiles = (hd file).val::cfg.indexfiles;

			"cgi" =>
				path := tups.find("path");
				cmd := tups.find("cmd");
				if(path == nil || cmd == nil)
					return (nil, "missing path or cmd in cgi line");

				methods: list of string;
				methodtups := tups.find("methods");
				if(methodtups != nil)
					methods = sys->tokenize((hd methodtups).val, " ,").t1;
				cfg.cgipaths = ref ((hd path).val, (hd cmd).val, methods, Cgi)::cfg.cgipaths;

			"scgi" =>
				path := tups.find("path");
				addr := tups.find("addr");
				if(path == nil || addr == nil)
					return (nil, "missing path or addr in scgi line");

				methods: list of string;
				methodtups := tups.find("methods");
				if(methodtups != nil)
					methods = sys->tokenize((hd methodtups).val, " ,").t1;
				cfg.cgipaths = ref ((hd path).val, (hd addr).val, methods, Scgi)::cfg.cgipaths;
			"gzip" =>
				for(pl := tups.find("path"); pl != nil; pl = tl pl)
					cfg.gzpaths = (hd pl).val::cfg.gzpaths;
			}
		}
	}
	cfg.rev();
	return (cfg, nil);
}

Cfg.rev(cfg: self ref Cfg)
{
	cfg.listens = rev(cfg.listens);
	cfg.cgipaths = rev(cfg.cgipaths);
	cfg.indexfiles = rev(cfg.indexfiles);
	cfg.redirs = rev(cfg.redirs);
	cfg.auths = rev(cfg.auths);
	listingssort(cfg);
}


Repl.parse(restr, rulestr: string): (ref Repl, string)
{
	(re, err) := regex->compile(restr, 1);
	if(err != nil)
		return (nil, "bad regex: "+err);

	rule: list of ref (string, int);
	maxrepl := 0;
	for(;;) {
		(l, r) := str->splitstrl(rulestr, "$");
		if(r == nil) {
			rule = ref (l, -1)::rule;
			break;
		}
		r = r[1:];
		if(r != nil && r[0] == '$') {
			rule = ref (l+"$", -1)::rule;
			r = r[1:];
		} else {
			num := str->take(r, "0-9");
			if(num == nil)
				return (nil, "bad rule: $ not followed by number or dollar");
			n := int num;
			if(n > maxrepl)
				maxrepl = n;
			rule = ref (l, n)::rule;
			r = r[len num:];
		}
		rulestr = r;
	}
	rule = rev(rule);
	return (ref Repl(re, rule, maxrepl), nil);
}

Repl.apply(r: self ref Repl, s: string): (int, string, string)
{
	m := regex->executese(r.re, s, (0, len s), 1, 1);
	if(m == nil)
		return (0, nil, nil);
	if(r.maxrepl > len m-1)
		return (0, nil, "replacement group not in groups in regular expression");
	res := "";
	for(rl := r.rule; rl != nil; rl = tl rl) {
		(part, index) := *(hd rl);
		res += part;
		if(index == -1)
			continue;
		(b, e) := m[index];
		if(b == -1 || e == -1)
			return (0, nil, "replacement group did not match in regular expression");
		res += s[b:e];
	}
	return (1, res, nil);
}

Added appl/cmd/logparse.y.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
%{
include "sys.m";
	sys: Sys;
	print, sprint, fprint, fildes: import sys;
include "draw.m";
include "arg.m";
include "bufio.m";
	bufio: Bufio;
	Iobuf: import bufio;
include "daytime.m";
	daytime: Daytime;
include "dict.m";
	dict: Dictionary;
	Dict: import dict;
include "lists.m";
	lists: Lists;
include "string.m";
	str: String;

# line from the log file
Log: adt {
	d:	ref Dict;
	time:	int;

	parse:	fn(s: string): (ref Log, string);
	get:	fn(l: self ref Log, s: string): (string, string);
};


# what comes after keyword "match"
Expr: adt {
	pick {
	And or Or or Eq or Ne =>
		p0, p1:	cyclic ref Expr;
	Param or Str =>
		s:	string;
	}

	eval:	fn(e: self ref Expr, l: ref Log): int;
	text:	fn(e: self ref Expr): string;
};

# keywords "limit", "sort" & "reverse"
Final: adt {
	pick {
	Limit =>
		n:	int;
	Sort or Normalise =>
		s:	string;
	Reverse =>
	Lump =>
		s, cutoff, str:	string;
	}

	text:	fn(f: self ref Final): string;
};

# a table, its requirements & progress/state
Table: adt {
	name, descr:	string;
	match:	ref Expr;
	per:	list of string;
	keep:	list of string;
	final:	list of ref Final;

	rows:	array of array of ref (string, int, int, int);  # string value, int value, extra values (used by avg)
	types:	array of int;

	colnames:	fn(t: self ref Table): list of string;
	apply:	fn(t: self ref Table, l: ref Log): string;
	finalize:	fn(t: self ref Table, f: ref Final);
	averages:	fn(t: self ref Table);
	write:	fn(t: self ref Table, fd: ref Sys->FD): string;
	writetabbed:	fn(t: self ref Table, fd: ref Sys->FD): string;
	text:	fn(t: self ref Table): string;
};

YYSTYPE: adt {
	tab, word, str:	string;
	table:	ref Table;
	match:	ref Expr;
};

YYLEX: adt {
	lval:	YYSTYPE;
	lex:	fn(l: self ref YYLEX): int;
	error:	fn(l: self ref YYLEX, msg: string);
};

%}

%module Logparse {
	init:	fn(nil: ref Draw->Context, args: list of string);
}


%type <match>	exprs expr param

%token <tab>	TAB
%token <str>	STR
%token <word>	WORD
%token DESCR PER KEEP MATCH SORT LIMIT REVERSE NORMALISE LUMP END

%token AND
%token OR
%token EQ NE

%%

top:
	top table { tabs = curtab::tabs; }
	| { tabs = lists->reverse(tabs); }
	;

table:
	TAB { curtab = ref zerotab; curtab.name = $1; } descr matches pers keeps finals
	END {
		curtab.per = lists->reverse(curtab.per);
		curtab.keep = lists->reverse(curtab.keep);
		curtab.final = lists->reverse(curtab.final);
	}
	;

descr:
	DESCR STR { curtab.descr = $2; }
	|
	;

matches:
	matches match
	|
	;

match:
	MATCH exprs {
		if(curtab.match == nil)
			curtab.match = $2;
		else
			curtab.match = ref Expr.And(curtab.match, $2);
	}
	;

pers:
	pers per
	|
	;

per:
	PER WORD { curtab.per = $2::curtab.per; }
	;

exprs:
	expr AND expr	{ $$ = ref Expr.And ($1, $3); }
	| expr OR expr	{ $$ = ref Expr.Or ($1, $3); }
	| expr
	;

expr:
	param EQ param	{ $$ = ref Expr.Eq($1, $3); }
	| param NE param	{ $$ = ref Expr.Ne($1, $3); }
	| param
	;

param:
	WORD	{ $$ = ref Expr.Param ($1); }
	| STR	{ $$ = ref Expr.Str ($1); }
	;

keeps:
	keeps keep
	|
	;

keep:
	KEEP WORD { 
		if(!isaggregate($2) && len curtab.per != 0 && !has($2, curtab.per))
			fail(sprint("%s:%d: cannot have non-aggregate 'keep' key %q that is not specified as 'per'", tabfile, lineno, $2));
		curtab.keep = $2::curtab.keep;
	}
	;

finals:
	finals final
	|
	;

final:
	SORT WORD	{
		if(fieldindex(curtab, $2) < 0)
			fail(sprint("%s:%d: sort key %#q must be in 'per' or 'keep' statement too", tabfile, lineno, $2));
		curtab.final = ref Final.Sort ($2)::curtab.final;
	}
	| LIMIT WORD	{ curtab.final = ref Final.Limit (int $2)::curtab.final; }
	| REVERSE	{ curtab.final = ref Final.Reverse::curtab.final; }
	| NORMALISE WORD	{
		if(fieldindex(curtab, $2) < 0)
			fail(sprint("%s:%d: normalise key %#q must be in 'per' or 'keep' statement too", tabfile, lineno, $2));
		curtab.final = ref Final.Normalise ($2)::curtab.final;
	}
	| LUMP WORD WORD STR {
		if(fieldindex(curtab, $2) < 0)
			fail(sprint("%s:%d: lump key %#q must be in 'per' or 'keep' statement too", tabfile, lineno, $2));
		if(str->toint($3, 10).t1 != nil)
			fail(sprint("%s:%d: bad threshold, must be numeric", tabfile, lineno));
		curtab.final = ref Final.Lump ($2, $3, $4)::curtab.final;
	}
	;

%%

dflag: int;
qflag: int;

btab: ref Iobuf;
done: int;
zerotab: Table;

curtab: ref Table;
tabs: list of ref Table;
lineno := 1;

Searchblocksize: con big (32*1024);

tabfile, logfile: string;

init(nil: ref Draw->Context, args: list of string)
{
	sys = load Sys Sys->PATH;
	bufio = load Bufio Bufio->PATH;
	daytime = load Daytime Daytime->PATH;
	dict = load Dictionary Dictionary->PATH;
	str = load String String->PATH;
	lists = load Lists Lists->PATH;
	arg := load Arg Arg->PATH;

	starttime := endtime := -1;

	arg->init(args);
	arg->setusage(arg->progname()+" [-dq] [-s starttime] [-e endtime] tabfile log");
	while((c := arg->opt()) != 0)
		case c {
		'd' =>	dflag++;
		's' =>	starttime = int arg->earg();
		'e' =>	endtime = int arg->earg();
		'q' =>	qflag++;
		* =>	arg->usage();
		}
	args = arg->argv();
	if(len args != 2)
		arg->usage();
	tabfile = hd args;
	logfile = hd tl args;

	btab = bufio->open(tabfile, Bufio->OREAD);
	if(btab == nil)
		fail(sprint("open %q: %r", tabfile));

	blog := bufio->open(logfile, Bufio->OREAD);
	if(blog == nil)
		fail(sprint("open %q: %r", logfile));

	done = 0;
	lex := ref YYLEX;
	yyparse(lex);

	tabs = lists->reverse(tabs);
	if(dflag) {
		for(t := tabs; t != nil; t = tl t)
			warn((hd t).text()+"\n");
	}

	# seek to starttime if there is one
	if(starttime >= 0) {
		start := big 0;
		end := blog.seek(start, Bufio->SEEKEND);

		while((diff := end-start) >= big 2*Searchblocksize) {
			mid := start + diff/big 2;
			blog.seek(mid, Bufio->SEEKSTART);
			blog.gets('\n');
			line := blog.gets('\n');
			if(line != nil)
				(l, err) := Log.parse(line);
			if(line == nil || err != nil)
				break;  # current "start" is just fine

			if(l.time >= starttime)
				end = mid;
			else
				start = mid;
		}

		blog.seek(start, Bufio->SEEKSTART);
		blog.gets('\n');
	}

	# for each line in the log file...
	for(;;) {
		line := blog.gets('\n');
		if(line == nil)
			break;
		(l, err) := Log.parse(line);
		if(err != nil)
			fail("parselog: "+err);

		if(starttime >= 0 && l.time < starttime)
			continue;
		if(endtime >= 0 && l.time > endtime)
			break;

		# try each table to see if they "accept" it (by match expressions)
		for(t := tabs; t != nil; t = tl t) {
			tab := hd t;
			if(tab.match == nil || tab.match.eval(l))
				if((err = tab.apply(l)) != nil)
					fail(err);
		}
	}

	# now we reverse/limit/sort/normalise/lump and then recalculate averages
	for(t := tabs; t != nil; t = tl t) {
		tab := hd t;
		for(f := tab.final; f != nil; f = tl f)
			tab.finalize(hd f);

		tab.averages();
	}

	fd := sys->fildes(1);
	for(t = tabs; t != nil; t = tl t) {
		tab := hd t;
		err := "";
		if(qflag)
			err = tab.write(fd);
		else
			err = tab.writetabbed(fd);
		if(err != nil) {
			warn(sprint("write %q: %s", tab.name, err));
			continue;
		}
		sys->fprint(fd, "\n");
	}
}


YYLEX.error(nil: self ref YYLEX, err: string)
{
	fail(sprint("%s:%d: %s", tabfile, lineno, err));
}

YYLEX.lex(lex: self ref YYLEX): int
{
	if(done)
		return -1;
	for(;;){
		c := btab.getc();
		case c {
		'"' =>
			# read until end of string, two consecutive ones escape
			s: string;
			for(;;) {
				case c = btab.getc() {
				Bufio->EOF or Bufio->ERROR =>
					return -1;
				'"' =>
					c = btab.getc();
					if(c != '"') {
						btab.ungetc();
						lex.lval.str = s;
						return STR;
					}
					s[len s] = '"';
				* =>
					s[len s] = c;
				}
			}

		' ' or '\t' =>
			;
		'\n' =>
			lineno++;
			n := 0;
			for(;;) {
				c = btab.getc();
				if(c != '\n')
					break;
				lineno++;
				n++;
			}
			btab.ungetc();
			if(n > 0)
				return END;

		'!' =>
			c = btab.getc();
			if(c == '=')
				return NE;
			btab.ungetc();
			return -1;

		'=' =>
			c = btab.getc();
			if(c == '=')
				return EQ;
			btab.ungetc();
			return -1;

		'a' to 'z' or '0' to '9' or '(' or ')' =>
			s: string;
			s[len s] = c;
			for(;;) {
				case c = btab.getc() {
				'a' to 'z' or '0' to '9' or '(' or ')' or ':' =>
					s[len s] = c;
				Bufio->ERROR =>
					return -1;
				* =>
					if(c != Bufio->EOF)
						btab.ungetc();
					if(s[len s-1] == ':') {
						lex.lval.tab = s[:len s-1];
						return TAB;
					}

					case s {
					"descr" =>	return DESCR;
					"per" =>	return PER;
					"keep" =>	return KEEP;
					"match" =>	return MATCH;
					"sort" =>	return SORT;
					"limit" =>	return LIMIT;
					"reverse" =>	return REVERSE;
					"normalise" =>	return NORMALISE;
					"lump" =>	return LUMP;
					"and" =>	return AND;
					"or" =>		return OR;
					* =>
						lex.lval.word = s;
						return WORD;
					}
				}
			}

		Bufio->ERROR =>
			return -1;
		Bufio->EOF =>
			done = 1;
			return END;
		}
	}
}


keys := array[] of {
"msec",
"time",
"fromaddr",
"toaddr",
"method",
"host",
"path",
"httpversion",
"status",
"statusmsg",
"size",
"useragent",
"referer",
"fromdns",
};

Log.parse(s: string): (ref Log, string)
{
	l := str->unquoted(s);
	if(len l != len keys)
		return (nil, sprint("wrong number of tokens, want %d, have %d", len keys, len l));
	v := l2a(l);
	d := ref Dict;
	for(i := 0; i < len keys; i++)
		d.add((keys[i], v[i]));
	time := int v[1];
	return (ref Log (d, time), nil);
}


substr(sub, s: string): int
{
	return str->splitstrl(s, sub).t1 != nil;
}

aggrs := array[] of {
"count", "sum(size)", "avg(size)",
};
isaggregate(s: string): int
{
	for(i := 0; i < len aggrs; i++)
		if(aggrs[i] == s)
			return 1;
	return 0;
}

isavg(s: string): int
{
	return s == "avg(size)";
}

Log.get(l: self ref Log, s: string): (string, string)
{
	val := l.d.lookup(s);
	if(val != nil)
		return (val, nil);

	# might have empty value.  annoying dict interface...
	for(k := l.d.keys(); k != nil; k = tl k)
		if(hd k == s)
			return ("", nil);

	case s {
	"useragentname(useragent)" =>
		ua := l.get("useragent").t0;
		return (str->splitstrl(ua, " ").t0, nil);

	"bothuman(useragent)" =>
		bots := array[] of {
		"bot",
		"yahoo! slurp",
		};
		v := str->tolower(l.get("useragent").t0);
		for(i := 0; i < len bots; i++)
			if(substr(bots[i], v))
				return ("bot", nil);
		return ("human", nil);

	"fromip" =>
		v := l.get("fromaddr").t0;
		return (str->splitstrl(v, "!").t0, nil);

	"subnet16(fromip)" =>
		v := l.get("fromaddr").t0;
		e := sys->tokenize(v, ".").t1;
		return (hd e+"."+hd tl e, nil);

	"dnstld(dns)" =>
		v := l.get("fromdns").t0;
		if(v == nil)
			return ("<no reverse dns>", nil);
		return (str->splitstrr(v, ".").t1, nil);

	"domain(referer)" =>
		v := l.get("referer").t0;
		if(v == nil)
			return ("<no referer>", nil);
		if(str->prefix("http://", v))
			v = v[len "http://":];
		else if(str->prefix("https://", v))
			v = v[len "https://":];
		else
			return ("<malformed>", nil);
		return (str->splitstrl(v, "/").t0, nil);

	"dayofweek(time)" =>
		days := array[] of {
		"sun", "mon", "tue", "wed", "thu", "fri", "sat",
		};
		tm := daytime->gmt(l.time);
		return (days[tm.wday], nil);

	"date(time)" =>
		tm := daytime->gmt(l.time);
		return (sprint("%04d-%02d-%02d", 1900+tm.year, tm.mon+1, tm.mday), nil);

	"hour(time)" =>
		tm := daytime->gmt(l.time);
		return (sprint("%02d", tm.hour), nil);

	"week(time)" =>
		tm := daytime->gmt(l.time);
		week := 1+tm.yday/7;
		firstsat := tm.yday%7 + (6-tm.wday);
		if(firstsat != 6 && tm.yday > firstsat)
			week++;
		return (string week, nil);

	"month(time)" =>
		months := array[] of {
		"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"
		};
		tm := daytime->gmt(l.time);
		return (months[tm.mon], nil);

	"extension(path)" =>
		v := l.get("path").t0;
		rem: string;
		(rem, v) = str->splitr(v, "/.");
		if(rem != nil && rem[len rem-1] == '/')
			v = "";
		else
			v = "."+v;
		return (v, nil);

	"major(status)" =>
		v := l.get("status").t0;
		return (v[0:1], nil);

	* =>
		return (nil, "no such key/derivative: "+s);
	}
}


eval(e: ref Expr, l: ref Log): string
{
	pick ee := e {
	And =>
		if(eval(ee.p0, l) != "" && eval(ee.p1, l) != "")
			return "true";
		return "";
	Or =>
		if(eval(ee.p0, l) != "" || eval(ee.p1, l) != "")
			return "true";
		return "";
	Eq =>
		if(eval(ee.p0, l) == eval(ee.p1, l))
			return "true";
		return "";
	Ne =>
		if(eval(ee.p0, l) != eval(ee.p1, l))
			return "true";
		return "";
	Param =>
		(v, err) := l.get(ee.s);
		if(err != nil) {
			warn(sprint("eval %q: %s", ee.s, err));
			return "";
		}
		return v;
	Str =>
		return ee.s;
	}
}

Expr.eval(e: self ref Expr, l: ref Log): int
{
	return eval(e, l) != "";
}


Table.colnames(t: self ref Table): list of string
{
	v: list of string;
	for(l := t.per; l != nil; l = tl l)
		v = hd l::v;
	for(l = t.keep; l != nil; l = tl l)
		v = hd l::v;
	return lists->reverse(v);
}


Table.apply(t: self ref Table, l: ref Log): string
{
	# find row, or reuse existing row in case of aggregates
	(row, err) := getrow(t, l);

	i := len t.per;
	for(k := t.keep; err == nil && k != nil; k = tl k)
		err = setcol(row, i++, hd k, l, t.types);
	return err;
}

# NOTE: keep isaggregate() in sync!
setcol(row: array of ref (string, int, int, int), col: int, k: string, l: ref Log, types: array of int): string
{
	case k {
	"count" =>
		types[col] = 1;
		row[col].t1++;

	"sum(size)" =>
		types[col] = 1;
		v := l.get("size").t0;
		if(v != nil)
			row[col].t1 += int v;

	"avg(size)" =>
		types[col] = 1;
		v := l.get("size").t0;
		if(v != nil) {
			row[col].t2 += int v;
			row[col].t3++;
			row[col].t1 = row[col].t2/row[col].t3;
		}

	* =>
		(v, err) := l.get(k);
		if(err != nil)
			return err;
		row[col].t0 = v;
	}
	return nil;
}

getrow(t: ref Table, l: ref Log): (array of ref (string, int, int, int), string)
{
	# xxx should be done once during table init...
	if(t.types == nil)
		t.types = array[len t.per+len t.keep] of {* => 0};

	pvs := array[len t.per] of ref (string, int, int, int);
	i := 0;
	for(pers := t.per; pers != nil; pers = tl pers) {
		p := hd pers;
		(v, err) := l.get(p);
		if(err != nil)
			return (nil, err);
		pvs[i++] = ref (v, 0, 0, 0);
	}

	if(len pvs > 0) {
	nextrow:
		for(i = 0; i < len t.rows; i++) {
			for(j := 0; j < len pvs; j++)
				if(t.rows[i][j].t0 != pvs[j].t0)
					continue nextrow;
			return (t.rows[i], nil);
		}
	}

	ncol := len t.per+len t.keep;

	row := array[ncol] of {* => ref ("", 0, 0, 0)};
	row[:] = pvs;

	nrows := array[len t.rows+1] of array of ref (string, int, int, int);
	nrows[:] = t.rows;
	nrows[len t.rows] = row;
	t.rows = nrows;

	return (row, nil);
}

sort[T](a: array of T, ge: ref fn(a, b: T, field, numeric: int): int, field, numeric: int)
{
	for(i := 1; i < len a; i++) {
		tmp := a[i];
		for(j := i; j > 0 && ge(a[j-1], tmp, field, numeric); j--)
			a[j] = a[j-1];
		a[j] = tmp;
	}
}

# higher is first
rowge(a, b: array of ref (string, int, int, int), i, numeric: int): int
{
	if(numeric)
		return a[i].t1 < b[i].t1;
	return a[i].t0 < b[i].t0;
}

fieldindex(t: ref Table, s: string): int
{
	i := 0;
	for(l := t.per; l != nil; l = tl l)
		if(hd l == s)
			return i;
		else
			i++;
	for(l = t.keep; l != nil; l = tl l)
		if(hd l == s)
			return i;
		else
			i++;
	raise "unknown field requested: "+s;
}

Table.finalize(t: self ref Table, f: ref Final)
{
	if(t.rows == nil || len t.rows == 0)
		return;
	pick ff := f {
	Sort =>
		col := fieldindex(t, ff.s);
		sort(t.rows, rowge, col, t.types[col]);
	Limit =>
		if(len t.rows > ff.n)
			t.rows = t.rows[:ff.n];
	Reverse =>
		for(i := 0; i < len t.rows ; i++)
			(t.rows[i], t.rows[len t.rows-1-i]) = (t.rows[len t.rows-1-i], t.rows[i]);
	Normalise =>
		col := fieldindex(t, ff.s);
		if(t.types[col] != 1)
			fail(sprint("cannot normalise a non-integer"));
		total := 0;
		for(i := 0; i < len t.rows; i++)
			total += t.rows[i][col].t1;
		for(i = 0; i < len t.rows; i++)
			t.rows[i][col].t1 = 1000*t.rows[i][col].t1/total;
	Lump =>
		col := fieldindex(t, ff.s);
		if(t.types[col] != 1)
			fail(sprint("cannot lump a non-integer"));
		cutoff := int ff.cutoff;
		first := -1;
		i := 0;
		while(i < len t.rows) {
			r := t.rows[i];
			if(r[col].t1 <= cutoff) {
				if(first < 0) {
					first = i;
					for(j := 0; j < len t.types; j++)
						r[j].t0 = ff.str;
				} else {
					t.rows[first][col].t1 += r[col].t1;
					t.rows[first][col].t2 += r[col].t2;
					t.rows[first][col].t3 += r[col].t3;
					t.rows[i:] = t.rows[i+1:];
					t.rows = t.rows[:len t.rows-1];
					continue;
				}
			}
			i++;
		}
	}
}

Table.averages(t: self ref Table)
{
	i := 0;
	for(l := t.colnames(); l != nil; l = tl l) {
		if(isavg(hd l)) {
			for(j := 0; j < len t.rows; j++) {
				cell := t.rows[j][i];
				if(cell.t3 > 0)
					cell.t1 = cell.t2/cell.t3;
			}
		}
		i++;
	}
}

Table.write(t: self ref Table, fd: ref Sys->FD): string
{
	sys->fprint(fd, "%s: %s\n", t.name, t.descr);

	sys->fprint(fd, "%s\n", str->quoted(t.colnames()));
	for(i := 0; i < len t.rows; i++) {
		v: list of string;
		for(j := 0; j < len t.types; j++) {
			if(t.types[j])
				v = string t.rows[i][j].t1::v;
			else
				v = t.rows[i][j].t0::v;
		}
		sys->fprint(fd, "%s\n", str->quoted(lists->reverse(v)));
	}
	return nil;
}

Table.writetabbed(t: self ref Table, fd: ref Sys->FD): string
{
	sys->fprint(fd, "%s: %s\n", t.name, t.descr);
	for(l := t.per; l != nil; l = tl l)
		sys->fprint(fd, "\t%s", hd l);
	for(l = t.keep; l != nil; l = tl l)
		sys->fprint(fd, "\t%s", hd l);
	sys->fprint(fd, "\n");
	for(i := 0; i < len t.rows; i++) {
		for(j := 0; j < len t.types; j++) {
			if(t.types[j])
				sys->fprint(fd, "\t%d", t.rows[i][j].t1);
			else
				sys->fprint(fd, "\t%s", t.rows[i][j].t0);
		}
		sys->fprint(fd, "\n");
	}
	return nil;
}


Table.text(t: self ref Table): string
{
	s := sprint("%s:\n\tdescr \"%s\"\n", t.name, t.descr);

	if(t.match != nil)
		s += "\tmatch "+t.match.text()+"\n";

	for(l := t.per; l != nil; l = tl l)
		s += "\tper "+hd l+"\n";

	for(l = t.keep; l != nil; l = tl l)
		s += "\tkeep "+hd l+"\n";

	for(ff := t.final; ff != nil; ff = tl ff)
		s += "\t"+(hd ff).text()+"\n";

	return s;
}

Expr.text(e: self ref Expr): string
{
	pick ee := e {
	And =>
		return "("+ee.p0.text()+" and "+ee.p1.text()+")";
	Or =>
		return "("+ee.p0.text()+" or "+ee.p1.text()+")";
	Eq =>
		return "("+ee.p0.text()+" == "+ee.p1.text()+")";
	Ne =>
		return "("+ee.p0.text()+" != "+ee.p1.text()+")";
	Param =>
		return ee.s;
	Str =>
		return "\""+ee.s+"\"";
	}
}

Final.text(f: self ref Final): string
{
	pick ff := f {
	Sort =>
		return sprint("sort %s", ff.s);
	Limit =>
		return sprint("limit %d", ff.n);
	Reverse =>
		return "reverse";
	Normalise =>
		return sprint("normalise %s", ff.s);
	Lump =>
		return sprint("lump %s %s \"%s\"", ff.s, ff.cutoff, ff.str);
	}
}

has(s: string, l: list of string): int
{
	for(; l != nil; l = tl l)
		if(hd l == s)
			return 1;
	return 0;
}

l2a[T](l: list of T): array of T
{
	a := array[len l] of T;
	i := 0;
	for(; l != nil; l = tl l)
		a[i++] = hd l;
	return a;
}

say(s: string)
{
	if(dflag)
		warn(s);
}

warn(s: string)
{
	sys->fprint(sys->fildes(2), "%s\n", s);
}

fail(s: string)
{
	warn(s);
	raise "fail:"+s;
}

Changes to appl/cmd/mkfile.

95
96
97
98
99
100
101

102
103
104
105
106
107
108
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109







+







	ircfs.dis\
	itest.dis\
	itreplay.dis\
	kill.dis\
	listen.dis\
	lockfs.dis\
	logfile.dis\
	#logparse.dis\
	look.dis\
	ls.dis\
	lstar.dis\
	lszip.dis\
	m4.dis\
	man2html.dis\
	man2txt.dis\
265
266
267
268
269
270
271


272
273
274
275
276
277
278
279
280
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283







+
+









DISBIN=$ROOT/dis

<$ROOT/mkfiles/mkdis
<$ROOT/mkfiles/mksubdirs

auhdr.dis: auplay.dis
	rm -f auhdr.dis && cp auplay.dis auhdr.dis
logparse.b: logparse.y
	yacc -o logparse.b logparse.y

dbfs.dis: $MODDIR/styxservers.m
rawdbfs.dis: $MODDIR/styxservers.m
import.dis:	$MODDIR/encoding.m $MODDIR/factotum.m
basename.dis: $MODDIR/names.m
cleanname.dis: $MODDIR/names.m
vacfs.dis:	$MODDIR/vac.m $MODDIR/venti.m
vacget.dis:	$MODDIR/vac.m $MODDIR/venti.m
vacput.dis:	$MODDIR/vac.m $MODDIR/venti.m

Changes to appl/lib/mkfile.

72
73
74
75
76
77
78

79
80
81
82
83
84
85
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86







+







	keyset.dis\
	libc.dis\
	libc0.dis\
	lists.dis\
	lock.dis\
	login.dis\
	man.dis\
	mhttp.dis\
	memfs.dis\
	mpeg.dis\
	msgio.dis\
	#mercurial.dis\
	#mercurialwire.dis\
	#mercurialremote.dis\
	bdiff.dis\

Added appl/svc/httpd.sh.



1
2
+
+
#!/dis/sh
/dis/ip/shttpd -h -n /services/httpd/config.db

Deleted appl/svc/httpd/alarms.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45













































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Alarms;
include "sys.m";
	sys: Sys;

include "alarms.m";

Alarm.stop(a: self Alarm) 
{
	a.alchan <-= -1;
	fd:=sys->open("#p/"+string a.pid+"/ctl",sys->OWRITE);
	sys->fprint(fd, "killgrp");
}

Alarm.alarm(time: int): Alarm
{
	if (sys == nil)
		sys = load Sys Sys->PATH;

	pid := sys->pctl(sys->NEWPGRP|sys->FORKNS,nil);
	a:=Alarm(chan of int,pid);
	spawn listener(a.alchan);
	spawn sleeper(a.alchan,time,pid);
	return a;
}
	
sleeper(ch: chan of int, time, pid: int)
{
	sys->sleep(time);
	alt{
		ch <-= pid =>
			;
		* =>
			exit;
	}
}

listener(ch: chan of int)
{
	a := <-ch;
	if (a==-1)
		exit;
	fd := sys->open("#p/"+string a+"/ctl",sys->OWRITE);
	if (fd != nil)
		sys->fprint(fd, "killgrp");
}

Deleted appl/svc/httpd/alarms.m.

1
2
3
4
5
6
7
8
9
10
11











-
-
-
-
-
-
-
-
-
-
-
Alarms: module{
	PATH:  		con	"/dis/svc/httpd/alarms.dis";	

	Alarm: adt{
		alchan: chan of int;
		pid: int;
		stop: fn(a: self Alarm); 
		alarm: fn(time: int): Alarm;
	};
	
};

Deleted appl/svc/httpd/cache.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188




























































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Cache;

include "sys.m";
	sys : Sys;

include "bufio.m";
	bufio : Bufio;
Iobuf : import bufio;

include "lock.m";
	locks: Lock;
	Semaphore: import locks;

dbg_log : ref Sys->FD;

include "cache.m";

HASHSIZE : con 1019;

lru ,cache_size : int; # lru link, and maximum size of cache.
cur_size, cur_tag : int; # current size of cache and current number.

lock: ref Semaphore;

Cache_link : adt{
	name : string; 			# name of file
	contents : array of byte; 	# contents
	length : int; 			# length of file
	qid:Sys->Qid;			
	tag : int;
};

tab := array[HASHSIZE] of list of Cache_link;

hashasu(key : string,n : int): int
{
	i, h : int;
	h=0;
	i=0;
        while(i<len key){
		h = 10*h + key[i];
		h = h%n;
		i++;
	}
	return h%n;
}


insert(name: string, ctents: array of byte , length : int, qid:Sys->Qid) : int
{
	tmp : Cache_link;
	hash : int;
	lock.obtain();
	hash = hashasu(name,HASHSIZE);
	if (dbg_log!=nil){
		sys->fprint(dbg_log,"current size is %d, adding %s\n", cur_size,name);
	}
	while (cur_size+length > cache_size)
		throw_out();
	tmp.name =name;
	tmp.contents = ctents;
	tmp.length = length;
	tmp.qid = qid;
	tmp.tag = cur_tag;
	cur_size+=length;
	cur_tag++;
	if (cur_tag<0) cur_tag=0;
	tab[hash]= tmp :: tab[hash];
	lock.release();
	return 1;
}

find(name : string, qid:Sys->Qid) : (int, array of byte)
{
	hash,flag,stale : int;
	nlist : list of Cache_link;
	retval : array of byte;
	flag=0;
	nlist=nil;
	retval=nil;
	stale=0;
	lock.obtain();
	hash = hashasu(name,HASHSIZE);
	tmp:=tab[hash];
	for(;tmp!=nil;tmp = tl tmp){
		link:=hd tmp;
		if (link.name==name){
			if(link.qid.path==qid.path && link.qid.vers==qid.vers){
				link.tag=cur_tag;
				cur_tag++;
				flag = 1;
				retval = (hd tmp).contents;
			} else { # cache is stale
				lru--;  if(lru<0) lru = 0;
				link.tag = lru;
				stale = 1;
			}
		}
		nlist = link :: nlist;
	}
	tab[hash]=nlist;
	if (flag && (dbg_log!=nil))
		sys->fprint(dbg_log,"Found %s in cache, cur_tag is %d\n",name,cur_tag);
	if (stale){
		if (dbg_log!=nil)
			sys->fprint(dbg_log,"Stale %s in cache\n",name);
		throw_out();
	}
	lock.release();
	return (flag,retval);
}	

throw_out()
{
	nlist : list of Cache_link;
	for(i:=0;i<HASHSIZE;i++){
		tmp:=tab[i];
		for(;tmp!=nil;tmp = tl tmp)
			if ((hd tmp).tag==lru)
				break;
		if (tmp!=nil)
			break;
	}
	# now, the lru is in tab[i]...
	nlist=nil;
	if(i < len tab){
		for(;tab[i]!=nil;tab[i]=tl tab[i]){
			if ((hd tab[i]).tag==lru){
				if (dbg_log!=nil)
					sys->fprint(dbg_log,"Throwing out %s\n",(hd tab[i]).name);
				cur_size-=(hd tab[i]).length;	
				tab[i] = tl tab[i];
			}
			if (tab[i]!=nil)
				nlist = (hd tab[i]) :: nlist;
			if (tab[i]==nil) break;
		}
	}
	lru=find_lru();
	if (dbg_log!=nil)
		sys->fprint(dbg_log,"New lru is %d",lru);
	tab[i] = nlist;
}

find_lru() : int
{
	min := cur_tag;
	for(i:=0;i<HASHSIZE;i++){
		tmp:=tab[i];
		for(;tmp!=nil;tmp = tl tmp)
			if ((hd tmp).tag<min)
				min=(hd tmp).tag;
	}
	return min;
}

cache_init(log : ref Sys->FD, csize : int)
{
	n : int;
	for(n=0;n<HASHSIZE;n++)
		tab[n]= nil;
	lru=0;
	cur_size=0;
	cache_size = csize*1024;
	sys = load Sys Sys->PATH;
	locks = load Lock Lock->PATH;
	locks->init();
	lock = Semaphore.new();
	dbg_log = log;
	if (dbg_log!=nil)
		sys->fprint(dbg_log,"Cache initialised, max size is %d K\n",cache_size);
}

dump() : list of (string,int,int)
{
	retval: list of (string,int,int);
	lock.obtain();
	for(i:=0;i<HASHSIZE;i++){
		tmp:=tab[i];
		while(tmp!=nil){
			retval = ((hd tmp).name, (hd tmp).length,
					(hd tmp).tag) :: retval;
			tmp = tl tmp;
		}
	}
	lock.release();
	return retval;
}

Deleted appl/svc/httpd/cache.m.

1
2
3
4
5
6
7
8
9









-
-
-
-
-
-
-
-
-
Cache : module
{
	PATH: con "/dis/svc/httpd/cache.dis";

	cache_init: fn(log : ref Sys->FD,  size : int);
	insert : fn(name: string, ctents: array of byte, length : int, qid:Sys->Qid) : int;
	find: fn(name : string, qid:Sys->Qid) : (int,array of byte);
	dump : fn() : list of (string,int,int);
};

Deleted appl/svc/httpd/cgiparse.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258


































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement CgiParse;

include "sys.m";
	sys: Sys;
include "draw.m";
include "string.m";
	str: String;
include "bufio.m";
include "daytime.m";
	daytime : Daytime;
include "parser.m";
	parser : Parser;
include "contents.m";
include "cache.m";
include "httpd.m";
	Private_info: import Httpd;
include "cgiparse.m";

stderr : ref Sys->FD;

cgiparse(g: ref Private_info, req: Httpd->Request): ref CgiData
{
	ret: ref CgiData;
	(ok, err) := loadmodules();
	if(ok == -1) {
		sys->fprint(stderr, "CgiParse: %s\n", err );
		return nil;
	}

	(ok, err, ret) = parse(g, req);

	if(ok < 0){
		sys->fprint( stderr, "CgiParse: %s\n", err );
		return nil;
	}
	return ret;
}

badmod(p: string): (int, string)
{
	return (-1, sys->sprint("cannot load %s: %r", p));
}

loadmodules(): (int, string)
{
	if( sys == nil )
		sys = load Sys Sys->PATH;
	stderr = sys->fildes(2);
	if(daytime == nil)
		daytime = load Daytime Daytime->PATH;
	if(daytime == nil)
		return badmod(Daytime->PATH);
	if(str == nil)
		str = load String String->PATH;
	if(str == nil)
		return badmod(String->PATH);
	if( parser == nil )
		parser = load Parser Parser->PATH;
	if( parser == nil )
		return badmod(Parser->PATH);
	return (0, nil);
}

parse(g: ref Private_info, req: Httpd->Request) : (int, string, ref CgiData)
{
	bufio := g.bufio;
	Iobuf: import bufio;
	
	host, remote, referer, httphd : string;
	form: list of (string, string);
	
	tmstamp := daytime->time();

	(method, version, uri, search) := (req.method, req.version, req.uri, req.search);
	
	if(version != ""){
		if( g.version == nil )
			return (-1, "version unknown.", nil);
		if( g.bout == nil )
			return (-1, "internal error, g.bout is nil.", nil);
		if( g.bin == nil )
			return (-1, "internal error, g.bin is nil.", nil);
		httphd = g.version + " 200 OK\r\n" +
			"Server: Inferno-Httpd\r\n" +
			"MIME-version: 1.0\r\n" +
			"Date: " + tmstamp + "\r\n" +
			"Content-type: text/html\r\n" +
			"\r\n";
	}
	
	hstr := "";
	lastnl := 1;
	eof := 0;
	while((c := g.bin.getc()) != bufio->EOF ) {	
		if (c == '\r' ) {	
			hstr[len hstr] = c;
			c = g.bin.getb();
			if( c == bufio->EOF ){
				eof = 1;
				break;
			}
		}
		hstr[len hstr] = c;
		if(c == '\n' ){	
			if( lastnl )
				break;
			lastnl = 1;
		}
		else
			lastnl = 0;
	}
	host = g.host;
	remote = g.remotesys;
	referer = g.referer;
	(cnt, header) := parseheader( hstr );
	method = str->toupper( method);
	if (method  == "POST") {	
		s := "";
		while(!eof && cnt && (c = g.bin.getc()) != '\n' ) {	
			s[len s] = c;
			cnt--;
			if( c == '\r' )
				eof = 1;
		}
		form = parsequery(s);
	}
	for (ql := parsequery(req.search); ql != nil; ql = tl ql)
		form = hd ql :: form;
	return (0, nil, 
		ref CgiData(method, version, uri, search, tmstamp, host, remote, referer,
		httphd, header, form));
}

parseheader(hstr: string): (int, list of (string, string))
{
	header : list of (string, string);
	cnt := 0;
	if( hstr == nil || len hstr == 0 )
		return (0, nil);
	(n, sl) := sys->tokenize( hstr, "\r\n" );
	if( n <= 0 )
		return (0, nil);
	while( sl != nil ){
		s := hd sl;
		sl = tl sl;
		for( i := 0; i < len s; i++ ){	
				if( s[i] == ':' ){
				tag := s[0:i+1];
				val := s[i+1:];
				if( val[len val - 1] == '\r' )
					val[len val - 1] = ' ';
				if( val[len val - 1] == '\n' )
					val[len val - 1] = ' ';
				header = (tag, val) :: header;
				if(str->tolower( tag ) == "content-length:" ){
					if( val != nil && len val > 0 )
						cnt = int val;
					else
						cnt = 0;
				}
				break;
			}
		}
	}
	return (cnt, listrev( header ));
}

listrev(s: list of (string, string)): list of (string, string)
{
	    tmp : list of (string, string);
	    while( s != nil ) {
		tmp = hd s :: tmp;
		s = tl s;
	    }
	    return tmp;
}

getbaseip() : string
{
	buf : array of byte;
	fd := sys->open( "/net/bootp", Sys->OREAD );
	if( fd != nil ){
		(n, d) := sys->fstat( fd );
		if( n >= 0 ){
			if(int d.length > 0 )
				buf = array [int d.length] of byte;
			else
				buf = array [128] of byte;
			n = sys->read( fd, buf, len buf );
			if( n > 0 ){
				(nil, sl) := sys->tokenize( string buf[0:n], " \t\n" );
				while( sl != nil ){
					if( hd sl == "ipaddr" ){
						sl = tl sl;
						break;
					}
					sl = tl sl;
				}
				if( sl != nil )
					return "http://" + (hd sl);
			}
		}
	}
	return "http://beast2";
}

getbase() : string
{
	fd := sys->open( "/dev/sysname", Sys->OREAD );
	if( fd != nil ){
		buf := array [128] of byte;
		n := sys->read( fd, buf, len buf );
		if( n > 0 )
			return "http://" + string buf[0:n];
	}
	return "http://beast2";
}

gethost() : string
{
	fd := sys->open( "/dev/sysname", Sys->OREAD );
	if(fd != nil) {
		buf := array [128] of byte;
		n := sys->read( fd, buf, len buf );
		if( n > 0 )
			return string buf[0:n];
	}
	return "none";
}

# parse a search string of the form
# tag=val&tag1=val1...
parsequery(search : string): list of (string, string)
{
	q: list of (string, string);
	tag, val : string;
	if (contains(search, '?'))
		(nil,search) = str->splitr(search,"?");
	while(search!=nil){
		(tag,search) = str->splitl(search,"=");
		if (search != nil) {
			search=search[1:];
			(val,search) = str->splitl(search,"&");
			if (search!=nil)
				search=search[1:];
			q = (parser->urlunesc(tag), parser->urlunesc(val)) :: q;
		}
	}
	return q;
}

contains(s: string, c: int): int
{
	for (i := 0; i < len s; i++)
		if (s[i] == c)
			return 1;
	return 0;
}

Deleted appl/svc/httpd/cgiparse.m.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22






















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
CgiData : adt {
    method : string;
    version : string;
    uri : string;
    search : string;
    tmstamp : string;
    host : string;
    remote : string;
    referer : string;
    httphd : string;
    header : list of (string, string);
    form : list of (string, string);
};

CgiParse : module
{
    PATH : con "/dis/svc/httpd/cgiparse.dis";
    cgiparse : fn( g : ref Httpd->Private_info, req: Httpd->Request): ref CgiData;
    getbase : fn() : string;
    gethost : fn() : string;
};

Deleted appl/svc/httpd/contents.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Contents;

include "sys.m";
	sys: Sys;
	dbg_log : ref Sys->FD;
include "draw.m";

include "bufio.m";
	bufio: Bufio;
Iobuf : import bufio;
	
include "contents.m";

include "cache.m";

include "httpd.m";

include "string.m";
	str : String;

Suffix: adt{
	suffix : string;
	generic : string;
	specific : string;
	encoding : string;
};

suffixes: list of Suffix;

#internal functions...
parsesuffix : fn(nil:string): (int,Suffix);

mkcontent(generic,specific : string): ref Content
{
	c:= ref Content; 	
	c.generic = generic;
	c.specific = specific;
	c.q = real 1;
	return c;
}

badmod(m: string)
{
	sys->fprint(stderr(), "contents: cannot load %s: %r\n", m);
	raise "fail:bad module";
}

contentinit(log: ref Sys->FD)
{
	if(suffixes != nil)
		return;

	sys = load Sys Sys->PATH;

	bufio = load Bufio Bufio->PATH;
	if (bufio == nil) badmod(Bufio->PATH);

	str = load String String->PATH;
	if (str == nil) badmod(String->PATH);

	iob := bufio->open(Httpd->HTTP_SUFF, bufio->OREAD);
	if (iob==nil) {
		sys->fprint(stderr(), "contents: cannot open %s: %r\n", Httpd->HTTP_SUFF);
		raise "fail:no suffix file";;
	}
	while((s := iob.gets('\n'))!=nil) {
		(i, su) := parsesuffix(s);
		if (i != 0)
			suffixes =  su :: suffixes;
	}
	dbg_log = log;
}

# classify by file name extensions

uriclass(name : string): (ref Content, ref Content)
{
	s : Suffix;
	typ, enc: ref Content;
	p : string;
	lis := suffixes;
	typ=nil;
	enc=nil;
	uri:=name;
	(nil,p) = str->splitr(name,"/");
	if (p!=nil) name=p;

	if(str->in('.',name)){
		(nil,p) = str->splitl(name,".");
		for(s = hd lis; lis!=nil; lis = tl lis){
			if(p == s.suffix){	
				if(s.generic != nil && typ==nil)
					typ = mkcontent(s.generic, s.specific);
				if(s.encoding != nil && enc==nil)
					enc = mkcontent(s.encoding, "");
			}
		s = hd lis;
		}
	}
	if(typ == nil && enc == nil){
		buff := array[64] of byte;
		fd := sys->open(uri, sys->OREAD);
		n := sys->read(fd, buff, len buff);
		if(n > 0){
			tmp := string buff[0:n];
			(typ, enc) = dataclass(tmp);
		}
	}
	return (typ, enc);
}


parsesuffix(line: string): (int, Suffix)
{
	s : Suffix;	
	if (str->in('#',line))
		(line,nil) = str->splitl(line, "#");
	if (line!=nil){
		(n,slist):=sys->tokenize(line,"\n\t ");
		if (n!=4 && n!=0){
			if (dbg_log!=nil)
				sys->fprint(dbg_log,"Error in suffixes file!, n=%d\n",n);
			sys->print("Error in suffixes file!, n=%d\n",n);
			exit;
		}
		s.suffix = hd slist;
		slist = tl slist;
		s.generic = hd slist;
		if (s.generic == "-") s.generic="";	
		slist = tl slist;
		s.specific = hd slist;
		if (s.specific == "-") s.specific="";	
		slist = tl slist;
		s.encoding = hd slist;
		if (s.encoding == "-") s.encoding="";
		
	}
	if (((s.generic ==  "")||(s.specific ==  "")) && s.encoding=="")
		return (0,s);
	return (1,s);
}

#classify by initial contents of file
dataclass(buf : string): (ref Content,ref Content)
{
	c,n : int;
	c=0;
	n = len buf;
	for(; n > 0; n --){		
		if(buf[c] < 16r80)
			if(buf[c] < 32 && buf[c] != '\n' && buf[c] != '\r' 
					&& buf[c] != '\t' && buf[c] != '\v')
				return (nil,nil);
		c++;		
	}
	return (mkcontent("text", "plain"),nil);
}

checkcontent(me: ref Content,oks :list of ref Content, clist : string): int
{
	ok:=oks;
	try : ref Content;
	if(oks == nil || me == nil)
		return 1;
	for(; ok != nil; ok = tl ok){
		try = hd ok;
		if((try.generic==me.generic || try.generic=="*")
		&& (try.specific==me.specific || try.specific=="*")){
			return 1;
		}
	}

	sys->fprint(dbg_log,"%s/%s not found", 
				me.generic, me.specific);
	logcontent(clist, oks);
	return 1;
}

logcontent(name : string, c : list of ref Content)
{
	buf : string;
	if (dbg_log!=nil){
		for(; c!=nil; c = tl c)
			buf+=sys->sprint("%s/%s ", (hd c).generic,(hd c).specific);
		sys->fprint(dbg_log,"%s: %s: %s", "client", name, buf);
	}
}

stderr(): ref Sys->FD
{
	return sys->fildes(2);
}

Deleted appl/svc/httpd/contents.m.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Contents: module
{
	PATH:		con	"/dis/svc/httpd/contents.dis";

	Content: adt{
		generic: string;
		specific: string;
		q: real;
	};
	
	contentinit: fn(log : ref Sys->FD);
	mkcontent: fn(specific,generic : string): ref Content;
	uriclass:  fn(name : string): (ref Content, ref Content);
	checkcontent: fn(me: ref Content,oks :list of ref Content, 
			clist : string): int;
};

Deleted appl/svc/httpd/date.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264








































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Date;

include "sys.m";
	sys: Sys;

include "daytime.m";
	daytime : Daytime;

Tm: import daytime;

include "date.m";

 # print dates in the format
 # Wkd, DD Mon YYYY HH:MM:SS GMT
 # parse dates of formats
 # Wkd, DD Mon YYYY HH:MM:SS GMT
 # Weekday, DD-Mon-YY HH:MM:SS GMT
 # Wkd Mon ( D|DD) HH:MM:SS YYYY
 # plus anything similar

SEC2MIN: con 60;
SEC2HOUR: con (60*SEC2MIN);
SEC2DAY: con (24*SEC2HOUR);

#  days per month plus days/year

dmsize := array[] of {
	365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

ldmsize := array[] of {
	366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

#  return the days/month for the given year


weekdayname := array[] of {
	"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};

wdayname := array[] of {
	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};


monname := array[] of {
	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};


init()
{
	sys = load Sys Sys->PATH;
	daytime = load Daytime Daytime->PATH;
	if (daytime==nil){
		sys->print("daytime load: %r\n");
		exit;
	}
}

yrsize(yr : int): array of int
{
	if(yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0))
		return ldmsize;
	else
		return dmsize;
}

tolower(c: int): int
{
	if(c >= 'A' && c <= 'Z')
		return c - 'A' + 'a';
	return c;
}


isalpha(c: int): int
{
	return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';
}


isdig(c: int): int
{
	return c >= '0' && c <= '9';
}


dateconv(t: int): string
{
	tm : ref Tm;
	tm = daytime->gmt(t);
	return sys->sprint("%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT",
		wdayname[tm.wday], tm.mday, monname[tm.mon], tm.year+1900,
		tm.hour, tm.min, tm.sec);	
}


dateword(date : string): (string,string)
{
	p : string;
	i:=0;
	p = "";
	while((i<len date) && !isalpha(date[i]) && !isdig(date[i]))
		i++;
	while((i<len date) && isalpha(date[i])){		
		p[len p] = tolower(date[i]);
		i++;
	}
	return (date[i:],p);
}


datenum(date : string): (string, int)
{
	n, i : int;
	i=0;
	while((i<len date) && !isdig(date[i]))
		i++;
	if(i == len date)
		return (nil, -1);
	n = 0;
	while((i<len date) && isdig(date[i])){
		n = n * 10 + date[i] - '0';
		i++;
	}
	return (date[i:], n);
}


 # parse a date and return the seconds since the epoch
 # return 0 for a failure
 
# could be big?
date2sec(date : string): int
{
	tm : Tm;
	buf : string;
	
	 # Weekday|Wday
	 
	(date,buf) = dateword(date);
	tm.wday = dateindex(buf, wdayname);
	if(tm.wday < 0)
		tm.wday = dateindex(buf, weekdayname);

	if(tm.wday < 0)
		return 0;

	 # check for the two major formats
	
	(date,buf) = dateword(date);
	tm.mon = dateindex(buf, monname);
	if(tm.mon >= 0){
		 # MM
		(date, tm.mday) = datenum(date);
		if(tm.mday < 1 || tm.mday > 31)
			return 0;

		 # HH:MM:SS
		(date, tm.hour) = datenum(date);
		if(tm.hour < 0 || tm.hour >= 24)
			return 0;
		(date, tm.min) = datenum(date);
		if(tm.min < 0 || tm.min >= 60)
			return 0;
		(date, tm.sec) = datenum(date);
		if(tm.sec < 0 || tm.sec >= 60)
			return 0;

		
		 # YYYY 
		(nil, tm.year) = datenum(date);
		if(tm.year < 70 || tm.year > 99 && tm.year < 1970)
			return 0;
		if(tm.year >= 1970)
			tm.year -= 1900;
	}else{
		# MM-Mon-(YY|YYYY)
		(date, tm.mday) = datenum(date);
		if(tm.mday < 1 || tm.mday > 31)
			return 0;
		(date,buf) = dateword(date);
		tm.mon = dateindex(buf, monname);
		if(tm.mon < 0 || tm.mon >= 12)
			return 0;
		(date, tm.year) = datenum(date);
		if(tm.year < 70 || tm.year > 99 && tm.year < 1970)
			return 0;
		if(tm.year >= 1970)
			tm.year -= 1900;
		
		 # HH:MM:SS
		(date, tm.hour) = datenum(date);
		if(tm.hour < 0 || tm.hour >= 24)
			return 0;
		(date, tm.min) = datenum(date);
		if(tm.min < 0 || tm.min >= 60)
			return 0;
		(date, tm.sec) = datenum(date);
		if(tm.sec < 0 || tm.sec >= 60)
			return 0;

		 # timezone
		(date,buf)=dateword(date);
		if(buf[0:3]!="gmt")
			return 0;
	}

	tm.zone="GMT";
	return gmtm2sec(tm);
}

lowercase(name:string): string
{
	p: string;
	for(i:=0;i<len name;i++)
		p[i]=tolower(name[i]);
	return p;
}

dateindex(d : string, tab : array of string): int
{
	for(i := 0; i < len tab; i++)
		if (lowercase(tab[i]) == d)
			return i;
	return -1;
}


# compute seconds since Jan 1 1970 GMT

gmtm2sec(tm:Tm): int 
{
	secs,i : int;
	d2m: array of int;
	secs=0;

	#seconds per year
	tm.year += 1900;
	if(tm.year < 1970)
		return 0;
	for(i = 1970; i < tm.year; i++){
		d2m = yrsize(i);
		secs += d2m[0] * SEC2DAY;
	}


	#seconds per month
	d2m = yrsize(tm.year);
	for(i = 0; i < tm.mon; i++)
		secs += d2m[i+1] * SEC2DAY;

	#secs in last month
	secs += (tm.mday-1) * SEC2DAY;

	#hours, minutes, seconds	
	secs += tm.hour * SEC2HOUR;
	secs += tm.min * SEC2MIN;
	secs += tm.sec;

	return secs;
}

Deleted appl/svc/httpd/date.m.

1
2
3
4
5
6
7
8
9
10
11











-
-
-
-
-
-
-
-
-
-
-

Date: module{
	PATH : con "/dis/svc/httpd/date.dis";

	init: fn();
	dateconv: fn(secs :int): string; # returns an http formatted
					 # date representing secs.
	date2sec: fn(foo:string): int;   # parses a date and returns
					 # number of secs since the 
					 # epoch that it represents. 
};

Deleted appl/svc/httpd/echo.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

























































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement echo;

include "sys.m";
	sys: Sys;
stderr: ref Sys->FD;
include "bufio.m";

include "draw.m";
draw : Draw;

include "cache.m";
include "contents.m";
include "httpd.m";
	Private_info: import Httpd;

include "cgiparse.m";
cgiparse: CgiParse;

echo: module
{
    init: fn(g: ref Private_info, req: Httpd->Request);
};

init(g: ref Private_info, req: Httpd->Request) 
{	
	sys = load Sys Sys->PATH;
	stderr = sys->fildes(2);	
	cgiparse = load CgiParse CgiParse->PATH;
	if( cgiparse == nil ) {
		sys->fprint( stderr, "echo: cannot load %s: %r\n", CgiParse->PATH);
		return;
	}

	send(g, cgiparse->cgiparse(g, req));
}

send(g: ref Private_info, cgidata: ref CgiData ) 
{	
	bufio := g.bufio;
	Iobuf: import bufio;
	if( cgidata == nil ){
		g.bout.flush();
		return;
	}
	
	g.bout.puts( cgidata.httphd );
	
	g.bout.puts("<head><title>Echo</title></head>\r\n");
	g.bout.puts("<body><h1>Echo</h1>\r\n");
	g.bout.puts(sys->sprint("You requested a %s on %s", 
	cgidata.method, cgidata.uri));
	if(cgidata.search!=nil)
		g.bout.puts(sys->sprint(" with search string %s", cgidata.search));
	g.bout.puts(".\n");
	
	g.bout.puts("Your client sent the following headers:<p><pre>");
	g.bout.puts( "Client: " + cgidata.remote + "\n" );
	g.bout.puts( "Date: " + cgidata.tmstamp + "\n" );
	g.bout.puts( "Version: " + cgidata.version + "\n" );
	while( cgidata.header != nil ){
		(tag, val) := hd cgidata.header;
		g.bout.puts( tag + " " + val + "\n" );
		cgidata.header = tl cgidata.header;
	}
	
	g.bout.puts("</pre>\n");	
	if (cgidata.form != nil){	
		i := 0;
		g.bout.puts("</pre>");
		g.bout.puts("Your client sent the following form data:<p>");
		g.bout.puts("<table>\n");
		while(cgidata.form!=nil){	
			(tag, val) := hd cgidata.form;
			g.bout.puts(sys->sprint("<tr><td>%d</td><td><I> ",i));
			g.bout.puts(tag);
			g.bout.puts("</I></td> ");
			g.bout.puts("<td><B> ");
			g.bout.puts(val);
			g.bout.puts("</B></td></tr>\n");
			g.bout.puts("\n");
			cgidata.form = tl cgidata.form;
			i++;
		}
		g.bout.puts("</table>\n");
	}	
	g.bout.puts("</body>\n");
	g.bout.flush();
}

Deleted appl/svc/httpd/httpd.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
















































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Httpd;

include "sys.m";
	sys: Sys;

Dir: import sys;
FD : import sys;

include "draw.m";

include "bufio.m";
	bufio: Bufio;
	Iobuf: import bufio;

include "string.m";
	str: String;

include "readdir.m";
	readdir: Readdir;

include "daytime.m";
	daytime : Daytime;

include "cache.m";
	cache : Cache;

include "contents.m";
	contents: Contents;
	Content: import contents;

include "httpd.m";

include "parser.m";
	parser : Parser;

include "date.m";
	date: Date;

include "redirect.m";
	redir: Redirect;

include "alarms.m";
	alarms: Alarms;
	Alarm: import alarms;

# globals 

cache_size: int;
port := "80";
addr: string;
stderr : ref FD;
dbg_log, logfile: ref FD;
debug: int;
my_domain: string;

usage()
{
	sys->fprint(stderr, "usage: httpd [-c num] [-D] [-a servaddr]\n");
	raise "fail:usage";
}

atexit(g: ref Private_info)
{
	debug_print(g,"At exit from httpd, closing fds. \n");
	g.bin.close();	
	g.bout.close();
	g.bin=nil;
	g.bout=nil;
	exit;
}

debug_print(g : ref Private_info,message : string)
{
	if (g.dbg_log!=nil)
		sys->fprint(g.dbg_log,"%s",message);
}

parse_args(args : list of string)
{
	while(args!=nil){
		case (hd args){
			"-c" =>
				args = tl args;
				cache_size = int hd args;
			"-D" =>
				debug=1;
			"-p" =>
				args = tl args;
				port = hd args;
			"-a" =>
				args = tl args;
				addr = hd args;
		}
		args = tl args;
	}
}

badmod(m: string)
{
	sys->fprint(stderr, "httpd: cannot load %s: %r\n", m);
	raise "fail:bad module";
}

init(nil: ref Draw->Context, argv: list of string)
{	
	# Load global modules.
	sys = load Sys Sys->PATH;
	stderr = sys->fildes(2);

	bufio = load Bufio Bufio->PATH;	
	if (bufio==nil) badmod(Bufio->PATH);

	str = load String String->PATH;
	if (str == nil) badmod(String->PATH);

	date = load Date Date->PATH;
	if(date == nil) badmod(Date->PATH);

	readdir = load Readdir Readdir->PATH;
	if(readdir == nil) badmod(Readdir->PATH);

	daytime = load Daytime Daytime->PATH;
	if(daytime == nil) badmod(Daytime->PATH);

	contents = load Contents Contents->PATH;
	if(contents == nil) badmod(Contents->PATH);

	cache = load Cache Cache->PATH;
	if(cache == nil) badmod(Cache->PATH);

	alarms = load Alarms Alarms->PATH;
	if(alarms == nil) badmod(Alarms->PATH);

	redir = load Redirect Redirect->PATH;
	if(redir == nil) badmod(Redirect->PATH);

	parser = load Parser Parser->PATH;
	if(parser == nil) badmod(Parser->PATH);

	logfile=sys->create(HTTPLOG,Sys->ORDWR,8r666);
	if (logfile==nil) {
		sys->fprint(stderr, "httpd: cannot open %s: %r\n", HTTPLOG);
		raise "cannot open http log";
	}

	# parse arguments to httpd.

	cache_size=5000;
	debug = 0;
	parse_args(argv);
	if (debug==1){
		dbg_log=sys->create(DEBUGLOG,Sys->ORDWR,8r666);
		if (dbg_log==nil){
			sys->print("debug log open: %r\n");
			exit;
		}
	}else 
		dbg_log=nil;
	sys->fprint(dbg_log,"started at %s \n",daytime->time());

	# initialisation routines
	contents->contentinit(dbg_log);
	cache->cache_init(dbg_log,cache_size);
	redir->redirect_init(REWRITE);
	date->init();
	parser->init();
	my_domain=sysname();
	if(addr == nil){
		if(port != nil)
			addr = "tcp!*!"+port;
		else
			addr = "tcp!*!80";
	}
	(ok, c) := sys->announce(addr);
	if(ok < 0) {
		sys->fprint(stderr, "can't announce %s: %r\n", addr);
		exit;
	}
	sys->fprint(logfile,"************ Charon Awakened at %s\n",
			daytime->time());
	for(;;)
		doit(c);
	exit;
}


doit(c: Sys->Connection)
{
	(ok, nc) := sys->listen(c);
	if(ok < 0) {
		sys->fprint(stderr, "listen: %r\n");
		exit;
	}
	if (dbg_log!=nil)
		sys->fprint(dbg_log,"spawning connection.\n");
	spawn service_req(nc);
}

service_req(nc : Sys->Connection)
{
	buf := array[64] of byte;
	l := sys->open(nc.dir+"/remote", sys->OREAD);
	n := sys->read(l, buf, len buf);
	if(n >= 0)
		if (dbg_log!=nil)
			sys->fprint(dbg_log,"New client http: %s %s", nc.dir, 
							string buf[0:n]);
	#  wait for a call (or an error)
	#  start a process for the service
	g:= ref Private_info;
	g.bufio = bufio;
	g.dbg_log=dbg_log;
	g.logfile = logfile;
	g.modtime=0;
	g.mydomain = my_domain;
	g.version = "HTTP/1.0";
	g.cache = cache;
	g.okencode=nil;
	g.oktype=nil;
	g.getcerr="";
	g.parse_eof=0;
	g.eof=0;
	g.remotesys=getendpoints(nc.dir);
	debug_print(g,"opening in for "+string buf[0:n]+"\n");
	g.bin= bufio->open(nc.dir+"/data",bufio->OREAD);
	if (g.bin==nil){
		sys->print("bin open: %r\n");
		exit;
	}
	debug_print(g,"opening out for "+string buf[0:n]+"\n");
	g.bout= bufio->open(nc.dir+"/data",bufio->OWRITE);
	if (g.bout==nil){
		sys->print("bout open: %r\n");
		exit;
	}
	debug_print(g,"calling parsereq for "+string buf[0:n]+"\n");
	parsereq(g);
	atexit(g);
}

parsereq(g: ref Private_info)
{
	meth, v,magic,search,uri,origuri,extra : string;
	# 15 minutes to get request line
	a := Alarm.alarm(15*1000*60);
	meth = getword(g);
	if(meth == nil){
		parser->logit(g,sys->sprint("no method%s", g.getcerr));
		a.stop();
		parser->fail(g,Syntax,"");
	}
	uri = getword(g);
	if(uri == nil || len uri == 0){
		parser->logit(g,sys->sprint("no uri: %s%s", meth, g.getcerr));
		a.stop();
		parser->fail(g,Syntax,"");
	}
	v = getword(g);
	extra = getword(g);
	a.stop();
	if(extra != nil){
			parser->logit(g,sys->sprint(
				"extra header word '%s'%s", 
					extra, g.getcerr));
			parser->fail(g,Syntax,"");
	}
	case v {
		"" =>
			if(meth!="GET"){
				parser->logit(g,sys->sprint("unimplemented method %s%s", meth, g.getcerr));
				parser->fail(g,Unimp, meth);
			}
	
		"HTTP/V1.0" or "HTTP/1.0" or "HTTP/1.1" =>
			if((meth != "GET")  && (meth!= "HEAD") && (meth!="POST")){
				parser->logit(g,sys->sprint("unimplemented method %s", meth));
				parser->fail(g,Unimp, meth);
			}	
		* =>
			parser->logit(g,sys->sprint("method %s uri %s%s", meth, uri, g.getcerr));
			parser->fail(g,UnkVers, v);
	}

	# the fragment is not supposed to be sent
	# strip it because some clients send it

	(uri,extra) = str->splitl(uri, "#");
	if(extra != nil)
		parser->logit(g,sys->sprint("fragment %s", extra));
	
	 # munge uri for search, protection, and magic	 
	(uri, search) = stripsearch(uri);
	uri = compact_path(parser->urlunesc(uri));
#	if(uri == SVR_ROOT)
#		parser->fail(g,NotFound, "no object specified");
	(uri, magic) = stripmagic(uri);
	debug_print(g,"stripmagic=("+uri+","+magic+")\n");

	 # normal case is just file transfer
	if(magic == nil || (magic == "httpd")){
		if (meth=="POST")
			parser->fail(g,Unimp,meth);	# /magic does handles POST
		g.host = g.mydomain;
		origuri = uri;
		parser->httpheaders(g,v);
		uri = redir->redirect(origuri);
		# must change this to implement proxies
		if(uri==nil){
			send(g,meth, v, origuri, search);
		}else{
			g.bout.puts(sys->sprint("%s 301 Moved Permanently\r\n", g.version));
			g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
			g.bout.puts("Server: Charon\r\n");
			g.bout.puts("MIME-version: 1.0\r\n");
			g.bout.puts("Content-type: text/html\r\n");
			g.bout.puts(sys->sprint("URI: <%s>\r\n",parser->urlconv(uri)));
			g.bout.puts(sys->sprint("Location: %s\r\n",parser->urlconv(uri)));
			g.bout.puts("\r\n");
			g.bout.puts("<head><title>Object Moved</title></head>\r\n");
			g.bout.puts("<body><h1>Object Moved</h1>\r\n");
			g.bout.puts(sys->sprint(
				"Your selection moved to <a href=\"%s\"> here</a>.<p></body>\r\n",
							 parser->urlconv(uri)));
			g.bout.flush();
		}
		atexit(g);
	}

	# for magic we init a new program
	do_magic(g,magic,uri,origuri,Request(meth, v, uri, search));
}

do_magic(g: ref Private_info,file, uri, origuri: string, req: Request)
{
	buf := sys->sprint("%s%s.dis", MAGICPATH, file);
	debug_print(g,"looking for "+buf+"\n");
	c:= load Cgi buf;
	if (c==nil){
		parser->logit(g,sys->sprint("no magic %s uri %s", file, uri));
		parser->fail(g,NotFound, origuri);
	}
	{
		c->init(g, req);
	}
	exception{
		"fail:*" =>
			return;
	}
}

send(g: ref Private_info,name, vers, uri, search : string)
{
	typ,enc : ref Content;
	w : string;
	n, bad, force301: int;
	if(search!=nil)
		parser->fail(g,NoSearch, uri);

	# figure out the type of file and send headers
	debug_print( g, "httpd->send->open(" + uri + ")\n" );
	fd := sys->open(uri, sys->OREAD);
	if(fd == nil){
		dbm := sys->sprint( "open failed: %r\n" );
		debug_print( g, dbm );
		notfound(g,uri);
	}
	(i,dir):=sys->fstat(fd);
	if(i< 0)
		parser->fail(g,Internal,"");
	if(dir.mode & Sys->DMDIR){
		(nil,p) := str->splitr(uri, "/");
		if(p == nil){
			w=sys->sprint("%sindex.html", uri);
			force301 = 0;
		}else{
			w=sys->sprint("%s/index.html", uri);
			force301 = 1; 
		}
		fd1 := sys->open(w, sys->OREAD);
		if(fd1 == nil){
			parser->logit(g,sys->sprint("%s directory %s", name, uri));
			if(g.modtime >= dir.mtime)
				parser->notmodified(g);
			senddir(g,vers, uri, fd, ref dir);
		} else if(force301 != 0 && vers != ""){
			g.bout.puts(sys->sprint("%s 301 Moved Permanently\r\n", g.version));
			g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
			g.bout.puts("Server: Charon\r\n");
			g.bout.puts("MIME-version: 1.0\r\n");
			g.bout.puts("Content-type: text/html\r\n");
			(nil, reluri) := str->splitstrr(parser->urlconv(w), SVR_ROOT);
			g.bout.puts(sys->sprint("URI: </%s>\r\n", reluri));
			g.bout.puts(sys->sprint("Location: http://%s/%s\r\n", 
				parser->urlconv(g.host), reluri));
			g.bout.puts("\r\n");
			g.bout.puts("<head><title>Object Moved</title></head>\r\n");
			g.bout.puts("<body><h1>Object Moved</h1>\r\n");
			g.bout.puts(sys->sprint(
				"Your selection moved to <a href=\"/%s\"> here</a>.<p></body>\r\n",
					reluri));
			atexit(g);
		}
		fd = fd1;
		uri = w;
		(i,dir)=sys->fstat(fd);
		if(i < 0)
			parser->fail(g,Internal,"");
	}
	parser->logit(g,sys->sprint("%s %s %d", name, uri, int dir.length));
	if(g.modtime >= dir.mtime)
		parser->notmodified(g);
	n = -1;
	if(vers != ""){
		(typ, enc) = contents->uriclass(uri);
		if(typ == nil)
			typ = contents->mkcontent("application", "octet-stream");
		bad = 0;
		if(!contents->checkcontent(typ, g.oktype, "Content-Type")){
			bad = 1;
			g.bout.puts(sys->sprint("%s 406 None Acceptable\r\n", g.version));
			parser->logit(g,"no content-type ok");
		}else if(!contents->checkcontent(enc, g.okencode, "Content-Encoding")){
			bad = 1;
			g.bout.puts(sys->sprint("%s 406 None Acceptable\r\n", g.version));
			parser->logit(g,"no content-encoding ok");
		}else
			g.bout.puts(sys->sprint("%s 200 OK\r\n", g.version));
		g.bout.puts("Server: Charon\r\n");
		g.bout.puts(sys->sprint("Last-Modified: %s\r\n", date->dateconv(dir.mtime)));
		g.bout.puts(sys->sprint("Version: %uxv%ux\r\n", int dir.qid.path, dir.qid.vers));
		g.bout.puts(sys->sprint("Message-Id: <%uxv%ux@%s>\r\n",
			int dir.qid.path, dir.qid.vers, g.mydomain));
		g.bout.puts(sys->sprint("Content-Type: %s/%s", typ.generic, typ.specific));

#		if(typ.generic== "text")
#			g.bout.puts(";charset=unicode-1-1-utf-8");

		g.bout.puts("\r\n");
		if(enc != nil){
			g.bout.puts(sys->sprint("Content-Encoding: %s", enc.generic));
			g.bout.puts("\r\n");
		}
		g.bout.puts(sys->sprint("Content-Length: %d\r\n", int dir.length));
		g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
		g.bout.puts("MIME-version: 1.0\r\n");
		g.bout.puts("\r\n");
		if(bad)
			atexit(g);
	}
	if(name == "HEAD")
		atexit(g);
	# send the file if it's a normal file
	g.bout.flush();
	# find if its in hash....
	# if so, retrieve, if not add..
	conts : array of byte;
	(i,conts) = cache->find(uri, dir.qid);
	if (i==0){
		# add to cache...
		conts = array[int dir.length] of byte;
		sys->seek(fd,big 0,0);
		n = sys->read(fd, conts, len conts);
		cache->insert(uri,conts, len conts, dir.qid);
	}
	sys->write(g.bout.fd, conts, len conts);
}



# classify a file
classify(d: ref Dir): (ref Content, ref Content)
{
	typ, enc: ref Content;
	
	if(d.qid.qtype&sys->QTDIR)
		return (contents->mkcontent("directory", nil),nil);
	(typ, enc) = contents->uriclass(d.name);
	if(typ == nil)
		typ = contents->mkcontent("unknown ", nil);
	return (typ, enc);
}

# read in a directory, format it in html, and send it back
senddir(g: ref Private_info,vers,uri: string, fd: ref FD, mydir: ref Dir)
{
	myname: string;
	myname = uri;
	if (myname[len myname-1]!='/')
		myname[len myname]='/';
	(a, n) := readdir->readall(fd, Readdir->NAME);
	if(vers != ""){
		parser->okheaders(g);
		g.bout.puts("Content-Type: text/html\r\n");
		g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
		g.bout.puts(sys->sprint("Last-Modified: %d\r\n", 
				mydir.mtime));
		g.bout.puts(sys->sprint("Message-Id: <%d%d@%s>\r\n",
			int mydir.qid.path, mydir.qid.vers, g.mydomain));
		g.bout.puts(sys->sprint("Version: %d\r\n", mydir.qid.vers));
		g.bout.puts("\r\n");
	}
	g.bout.puts(sys->sprint("<head><title>Contents of directory %s.</title></head>\n",
		uri));
	g.bout.puts(sys->sprint("<body><h1>Contents of directory %s.</h1>\n",
		uri));
	g.bout.puts("<table>\n");
	for(i := 0; i < n; i++){
		(typ, enc) := classify(a[i]);
		g.bout.puts(sys->sprint("<tr><td><a href=\"%s%s\">%s</A></td>",
			myname, a[i].name, a[i].name));
		if(typ != nil){
			if(typ.generic!=nil)
				g.bout.puts(sys->sprint("<td>%s", typ.generic));
			if(typ.specific!=nil)
				g.bout.puts(sys->sprint("/%s", 
						typ.specific));
			typ=nil;
		}
		if(enc != nil){
			g.bout.puts(sys->sprint(" %s", enc.generic));
			enc=nil;
		}
		g.bout.puts("</td></tr>\n");
	}
	if(n == 0)
		g.bout.puts("<td>This directory is empty</td>\n");
	g.bout.puts("</table></body>\n");
	g.bout.flush();
	atexit(g);
}

stripmagic(uri : string): (string, string)
{
	prog,newuri : string;
	prefix := SVR_ROOT+"magic/";
	if (!str->prefix(prefix,uri) || len newuri == len prefix)
		return(uri,nil);
	uri=uri[len prefix:];
	(prog,newuri)=str->splitl(uri,"/");
	return (newuri,prog);
}

stripsearch(uri : string): (string,string)
{
	search : string;
	(uri,search) = str->splitl(uri, "?");
	if (search!=nil)
		search=search[1:];
	return (uri, search);
}

# get rid of "." and ".." path components; make absolute
compact_path(origpath:string): string
{
	if(origpath == nil)
		origpath = "";
	(origpath,nil) = str->splitl(origpath, "`;| "); # remove specials
	(nil,olpath) := sys->tokenize(origpath, "/");
	rlpath : list of string;
	for(p := olpath; p != nil; p = tl p) {
		if(hd p == "..") {
			if(rlpath != nil)
				rlpath = tl rlpath;
		} else if(hd p != ".")
			rlpath = (hd p) :: rlpath;
	}
	cpath := "";
	if(rlpath!=nil){		
		cpath = hd rlpath;
		rlpath = tl rlpath;
		while( rlpath != nil ) {
			cpath = (hd rlpath) + "/" +  cpath;
			rlpath = tl rlpath;
		}
	}
	return SVR_ROOT + cpath;
}

getword(g: ref Private_info): string
{
	c: int;
	while((c = getc(g)) == ' ' || c == '\t' || c == '\r')
		;
	if(c == '\n')
		return nil;
	buf := "";
	for(;;){
		case c{
		' ' or '\t' or '\r' or '\n' =>
			return buf;
		}
		buf[len buf] = c;
		c = getc(g);
	}
}

getc(g : ref Private_info): int
{
	# do we read buffered or unbuffered?
	# buf : array of byte;
	n : int;
	if(g.eof){
		debug_print(g,"eof is set in httpd\n");
		return '\n';
	}
	n = g.bin.getc();
	if (n<=0) { 
		if(n == 0)
			g.getcerr=": eof";
		else
			g.getcerr=sys->sprint(": n == -1: %r");
		g.eof = 1;
		return '\n';
	}
	n &= 16r7f;
	if(n == '\n')
		g.eof = 1;
	return n;
}

# couldn't open a file
# figure out why and return and error message
notfound(g : ref Private_info,url : string)
{
	buf := sys->sprint("%r!");
	(nil,chk):=str->splitstrl(buf, "file does not exist");
	if (chk!=nil) 
		parser->fail(g,NotFound, url);
	(nil,chk)=str->splitstrl(buf,"permission denied");
	if(chk != nil)
		parser->fail(g,Unauth, url);
	parser->fail(g,NotFound, url);
}

sysname(): string
{
	n : int;
	fd : ref FD;
	buf := array[128] of byte;
	
	fd = sys->open("#c/sysname", sys->OREAD);
	if(fd == nil)
		return "";
	n = sys->read(fd, buf , len buf);
	if(n <= 0)
		return "";
	
	return string buf[0:n];
}

sysdom(): string
{
	dn : string;
	dn = csquery("sys" , sysname(), "dom");
	if(dn == nil)
		dn = "who cares";
	return dn; 
}

#  query the connection server
csquery(attr, val, rattr : string): string
{
	token : string;
	buf := array[4096] of byte;
	fd : ref FD;
	n: int;
	if(val == "" ){
		return nil;
	}
	fd = sys->open("/net/cs", sys->ORDWR);
	if(fd == nil)
		return nil;
	sys->fprint(fd, "!%s=%s", attr, val);
	sys->seek(fd, big 0, 0);
	token = sys->sprint("%s=", rattr);
	for(;;){
		n = sys->read(fd, buf, len buf);
		if(n <= 0)
			break;
		name:=string buf[0:n];
		(nil,p) := str->splitstrl(name, token);
		if(p != nil){	
			(p,nil) = str->splitl(p, " \n");
			if(p == nil)
				return nil;
			return p[4:];
		}
	}
	return nil;
}

getendpoint(dir, file: string): (string, string)
{
	sysf := serv := "";
	fto := sys->sprint("%s/%s", dir, file);
	fd := sys->open(fto, sys->OREAD);

	if(fd !=nil) {
		buf := array[128] of byte;
		n := sys->read(fd, buf, len buf);
		if(n>0) {
			buf = buf[0:n-1];
			(sysf, serv) = str->splitl(string buf, "!");
			if (serv != nil)
				serv = serv[1:];
		}
	}
	if(serv == nil)
		serv = "unknown";
	if(sysf == nil)
		sysf = "unknown";
	return (sysf, serv);
}

getendpoints(dir: string): string
{
#	(lsys, lserv) := getendpoint(dir, "local");
	(rsys, nil) := getendpoint(dir, "remote");
	return rsys;
}

Deleted appl/svc/httpd/httpd.debug.

Deleted appl/svc/httpd/httpd.log.

Deleted appl/svc/httpd/httpd.m.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44












































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Httpd: module {
	
	Internal, TempFail, Unimp, UnkVers, BadCont, BadReq, Syntax, 
	BadSearch, NotFound, NoSearch , OnlySearch, Unauth, OK : con iota;	
	
	SVR_ROOT : con "/services/httpd/root/";
	HTTPLOG : con "/services/httpd/httpd.log";
	DEBUGLOG : con "/services/httpd/httpd.debug";
	HTTP_SUFF : con "/services/httpd/httpd.suff";
	REWRITE   : con "/services/httpd/httpd.rewrite";
	MAGICPATH : con "/dis/svc/httpd/"; # must end in /
	
	Private_info : adt{
		# used in parse and httpd
		bufio: Bufio;
		bin,bout : ref Bufio->Iobuf;
		logfile,dbg_log : ref Sys->FD;
		cache : Cache;
		eof : int;
		getcerr : string;
		version : string;
		okencode, oktype : list of ref Contents->Content;
		host : string; # initialized to mydomain just 	
			       # before parsing header
		remotesys, referer : string;
		modtime : int;
		# used by /magic for reading body
		clength : int;
		ctype : string;
		#only used in parse
		wordval : string;
		tok,parse_eof : int;
		mydomain,client : string;
		oklang : list of ref Contents->Content;
	};
	Request: adt {
		method, version, uri, search: string;
	};
	init: fn(ctxt: ref Draw->Context, argv: list of string);
};

Cgi: module{
	init: fn(g: ref Httpd->Private_info, req: Httpd->Request);
};

Deleted appl/svc/httpd/httpd.rewrite.

1
2
3
4
5
6
7
8
9
10










-
-
-
-
-
-
-
-
-
-
# syntax: pattern replacement
# The most specific pattern wins, and is applied once (no rescanning).
# Leave off trailing slash if pattern is a directory.
# Replacements starting with http:// return "Permanently moved" 
# message.
# e.g the following line aliases requests for / to requests for
# /usr/mig/html

# /   /usr/mig/html

Deleted appl/svc/httpd/httpd.suff.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110














































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#suffix		generic type	specific type	encoding
.C		text		plain		-		# C++ program
.Z		-		-		x-compress
.a		application	octet-stream	-		# [Mosaic]
.ada		text		plain		-		# ada program
.ai		application	postscript	-		# [Mosaic]
.aif		audio		x-aiff		-
.aifc		audio		x-aiff		-
.aiff		audio		x-aiff		-
.au		audio		basic		-		# sun audio
.avi		video		x-msvideo	-		# [Mosaic]
.awk		text		plain		-		# awk program
.bas		text		plain		-		# basic program
.bbl		text		plain		-		# BibTex output
.bcpio		application	x-bcpio		-		# [Mosaic]
.bib		text		plain		-		# BibTex input
.c		text		plain		-		# C program
.c++		text		plain		-		# C++ program
.cc		text		plain		-		# [Mosaic]
.cdf		application	x-netcdf	-
.cpio		application	x-cpio		-
.cpp		text		plain		-		# DOS C++ program
.dat		text		plain		-		# AMPL et al.
.diff		text		plain		-
.dvi		application	x-dvi		-		# TeX output
.enc		application	octet-stream	-		# encrypted file
.eps		application	postscript	-
.etx		text		x-setext	-		# [Mosaic]
.exe		application	octet-stream	-		# DOS executable
.executable	application	octet-stream	-		# DOS executable
.exz		application	octet-stream	x-gzip		# gziped DOS executable
.f		text		plain		-		# fortran-77 program
.flc		video		x-flc		-
.fli		video		x-fli		-
.gif		image		gif		-
.gtar		application	x-gtar		-		# [Mosaic]
.gz		-		-		x-gzip		# gziped file
.h		text		plain		-		# C header file
.hdf		application	x-hdf		-
.hqx		application	octet-stream	-		# Mac BinHex
.htm		text		html		-
.html		text		html		-
.ief		image		ief		-		# [Mosaic]
.jfif		image		jpeg		-		# [Mosaic]
.jfif-tbnl	image		jpeg		-		# [Mosaic]
.jpe		image		jpeg		-		# [Mosaic]
.jpeg		image		jpeg		-
.jpg		image		jpeg		-
.latex		application	x-latex		-		# [Mosaic]
.ltx		application	x-latex		-
.man		application	x-troff-man	-		# [Mosaic]
.me		application	x-troff-me	-		# [Mosaic]
.mime		message		rfc822		-		# [Mosaic]
.mod		text		plain		-		# AMPL et al.
.mov		video		quicktime	-		# [Mosaic]
.movie		video		x-sgi-movie	-		# [Mosaic]
.mpe		video		mpeg		-		# [Mosaic]
.mpeg		video		mpeg		-
.mpg		video		mpeg		-
.ms		application	x-troff-ms	-		# [Mosaic]
.mv		video		x-sgi-movie	-		# [Mosaic]
.nc		application	x-netcdf	-		# [Mosaic]
.o		application	octet-stream	-		# [Mosaic]
.oda		application	oda		-		# [Mosaic]
.pbm		image		x-portable-bitmap	-	# [Mosaic]
.pdf		application	pdf		-		# Adobe Portable Document Format
.pgm		image		x-portable-graymap	-	# [Mosaic]
.pl		text		plain		-		# [Mosaic]
.pnm		image		x-portable-anymap	-	# [Mosaic]
.ppm		image		x-portable-pixmap	-	# [Mosaic]
.ps		application	postscript	-
.qt		video		quicktime	-		# [Mosaic]
.r		text		plain		-		# ratfor program
.ras		image		x-cmu-rast	-		# [Mosaic]
.rc		text		plain		-		# rc
.rfr		text		plain		-		# refer
.rgb		image		x-rgb		-		# [Mosaic]
.roff		application	x-troff		-		# [Mosaic]
.rtf		application	rtf		-		# [Mosaic]
.rtx		text		richtext 	-	# MIME richtext	  [Mosaic]
.sh		application	x-shar		-
.shar		application	x-shar		-
.snd		audio		basic		-
.sv4cpio	application	x-sv4cpio	-		# [Mosaic]
.sv4crc		application	x-sv4crc	-		# [Mosaic]
.t		application	x-troff		-		# [Mosaic]
.tar		application	x-tar		-		# [Mosaic]
.taz		application	x-tar		x-compress
.tcl		application	x-tcl		-
.tex		application	x-tex		-		# Tex input
.texi		application	x-texinfo	-		# [Mosaic]
.texinfo	application	x-texinfo	-		# [Mosaic]
.text		text		plain		-		# [Mosaic]
.tgz		application	x-tar		x-gzip
.tif		image		tiff		-
.tiff		image		tiff		-
.toc		text		plain		-		# table of contents
.tr		application	x-troff		-		# [Mosaic]
.trz		application	x-tar		x-compress
.tsv		text		tab-separated-values	-	# [Mosaic]
.txt		text		plain		-
.ustar		application	x-ustar		-		# [Mosaic]
.wav		audio		x-wav		-
.wsrc		application	x-wais-source	-		# [Mosaic]
.xbm		image		x-xbitmap	-		# X bitmap
.xpm		image		x-xpixmap	-		# [Mosaic]
.xwd		image		x-xwindowdump	-		# [Mosaic]
.z		-		-		x-compress
.Z		-		-		x-compress
.zip		application	zip		-

Deleted appl/svc/httpd/imagemap.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251



























































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement imagemap;

include "sys.m";
	sys : Sys;

include "bufio.m";
	bufio: Bufio;
	Iobuf: 	import bufio;

include "draw.m";
	draw: Draw;

include "cache.m";
include "contents.m";

include "httpd.m";
	Private_info: import Httpd;
	OnlySearch, BadSearch, NotFound: import Httpd;
	g : ref Private_info;

include "parser.m";
	parser : Parser;

include "daytime.m";
	daytime: Daytime;

include "string.m";
	str : String;

imagemap : module
{
	init: fn(g : ref Private_info, req: Httpd->Request);
};

Point : adt {
	x,y : int;
};

me : string;

badmod(p: string)
{
	sys->fprint(sys->fildes(2), "imagemap: cannot load %s: %r\n", p);
	raise "fail:bad module";
}

init(k : ref Private_info, req: Httpd->Request)
{
	dest, s : string;
	sys = load Sys "$Sys";
	draw = load Draw "$Draw";

	daytime = load Daytime Daytime->PATH;
	if(daytime == nil) badmod(Daytime->PATH);

	parser = load Parser Parser->PATH;
	if(parser == nil) badmod(Parser->PATH);

	str = load String String->PATH;
	if (str == nil) badmod(String->PATH);

	me = "imagemap";

	g=k;
	bufio=g.bufio;
	parser->init();
	parser->httpheaders(g,req.version);
	dest = translate(req.uri, req.search);
	if(dest == nil){
		if(req.version!= ""){
			parser->okheaders(g);
			g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
			g.bout.puts("Content-type: text/html\r\n");
			g.bout.puts("\r\n");
		}
		g.bout.puts("<head><title>Nothing Found</title></head><body>\n");
		g.bout.puts("Nothing satisfying your search request could be found.\n</body>\n");
		return;
	}

	g.bout.puts(sys->sprint("%s 301 Moved Permanently\r\n", g.version));
	g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
	g.bout.puts("Server: Charon\r\n");
	g.bout.puts("MIME-version: 1.0\r\n");
	g.bout.puts("Content-type: text/html\r\n");
	(s,nil)=str->splitl(dest, ":");
	if(s!=nil){
		g.bout.puts(sys->sprint("URI: <%s>\r\n", parser->urlconv(dest)));
		g.bout.puts(sys->sprint("Location: %s\r\n", parser->urlconv(dest)));
	}else if(dest[0] == '/'){
		g.bout.puts(sys->sprint("URI: <%s>\r\n",parser->urlconv(dest)));
		g.bout.puts(sys->sprint("Location: http://%s%s\r\n", parser->urlconv(g.mydomain), parser->urlconv(dest)));
	} else {
		(req.uri,s) = str->splitr(req.uri, "/");
		g.bout.puts(sys->sprint("URI: <%s/%s>\r\n", parser->urlconv(req.uri), parser->urlconv(dest)));
		g.bout.puts(sys->sprint("Location: http://%s%s/%s\r\n", parser->urlconv(g.mydomain), parser->urlconv(req.uri), parser->urlconv(dest)));
	}
	g.bout.puts("\r\n");
	g.bout.puts("<head><title>Object Moved</title></head>\r\n");
	g.bout.puts("<body><h1>Object Moved</h1></body>\r\n");
	if(dest[0] == '/')
		g.bout.puts(sys->sprint("Your selection mapped to <a href=\"%s\"> here</a>.<p>\r\n", parser->urlconv(dest)));
	else
		g.bout.puts(sys->sprint("Your selection mapped to <a href=\"%s/%s\"> here</a>.<p>\r\n", parser->urlconv(req.uri), parser->urlconv(dest)));
}


translate(uri, search : string) : string
{
	b : ref Iobuf;
	p, c, q, start : Point;
	close, d : real;
	line, To, def, s : string;
	ok, n, inside, r : int;
	(pth,nil):=str->splitr(uri,"/");
	# sys->print("pth is %s",pth);
	if(search == nil)
		parser->fail(g,OnlySearch, me);
	(p, ok) = pt(search);
	if(!ok)
		parser->fail(g,BadSearch, me);

	b = bufio->open(uri, bufio->OREAD);
	if(b == nil){
		sys->fprint(sys->fildes(2), "imagemap: cannot open %s: %r\n", uri);
		parser->fail(g, NotFound, uri);
	}
	To = "";
	def = "";
	close = 0.;
	while((line = b.gets('\n'))!=nil){
		line=line[0:len line-1];

		(s, line) = getfield(line);
		if(s== "rect"){
			(s, line) = getfield(line);
			(q, ok) = pt(s);
			if(!ok || q.x > p.x || q.y > p.y)
				continue;
			(s, line) = getfield(line);
			(q, ok) = pt(s);
			if(!ok || q.x < p.x || q.y < p.y)
				continue;
			(s, nil) = getfield(line);
			return pth+s;
		}else if(s== "circle"){
			(s, line) = getfield(line);
			(c, ok) = pt(s);
			if(!ok)
				continue;
			(s, line) = getfield(line);
			(r,nil) = str->toint(s,10);
			(s, line) = getfield(line);
			d = real (r * r);
			if(d >= dist(p, c))
				return pth+s;
		}else if(s=="poly"){
			(s, line) = getfield(line);
			(start, ok) = pt(s);
			if(!ok)
				continue;
			inside = 0;
			c = start;
			for(n = 1; ; n++){
				(s, line) = getfield(line);
				(q, ok) = pt(s);
				if(!ok)
					break;
				inside = polytest(inside, p, c, q);
				c = q;
			}
			inside = polytest(inside, p, c, start);
			if(n >= 3 && inside)
				return pth+s;
		}else if(s== "point"){
			(s, line) = getfield(line);
			(q, ok) = pt(s);
			if(!ok)
				continue;
			d = dist(p, q);
			(s, line) = getfield(line);
			if(d == 0.)
				return pth+s;
			if(close == 0. || d < close){
				close = d;
				To = s;
			}
		}else if(s ==  "default"){
			(def, line) = getfield(line);
		}
	}
	if(To == nil)
		To = def;
	return pth+To;
}


polytest(inside : int,p, b, a : Point) : int{
	pa, ba : Point;

	if(b.y>a.y){
		pa=sub(p, a);
		ba=sub(b, a);
	}else{
		pa=sub(p, b);
		ba=sub(a, b);
	}
	if(0<=pa.y && pa.y<ba.y && pa.y*ba.x<=pa.x*ba.y)
		inside = !inside;
	return inside;
}


sub(p, q : Point) : Point {
	return (Point)(p.x-q.x, p.y-q.y);
}


dist(p, q : Point) : real {
	p.x -= q.x;
	p.y -= q.y;
	return real (p.x * p.x + p.y *p.y);
}


pt(s : string) : (Point, int) {
	p : Point;
	x, y : string;

	if(s[0] == '(')
		s=s[1:];
	(s,nil)=str->splitl(s, ")");
	p = Point(0, 0);
	(x,y) = str->splitl(s, ",");
	if(x == s)
		return (p, 0);
	(p.x,nil) = str->toint(x,10);
	if(y==nil)
		return (p, 0);
	y=y[1:];
	(p.y,nil) = str->toint(y, 10);
	return (p, 1);
}


getfield(s : string) : (string,string) {
	i:=0;
	while(s[i] == '\t' || s[i] == ' ')
		i++;
	return str->splitl(s[i:],"\t ");
}

Deleted appl/svc/httpd/mkfile.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50


















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
<../../../mkconfig

TARG=	cache.dis\
	contents.dis\
	date.dis\
	echo.dis\
	httpd.dis\
	imagemap.dis\
	parser.dis\
	redirect.dis\
	stats.dis\
	alarms.dis\
	cgiparse.dis\


MODULES=\
	cache.m\
	contents.m\
	date.m\
	httpd.m\
	parser.m\
	redirect.m\
	alarms.m\
	cgiparse.m\

SYSMODULES=

LOGS=	httpd.debug\
	httpd.log\
	httpd.rewrite\
	httpd.suff\

DISBIN=$ROOT/dis/svc/httpd

<$ROOT/mkfiles/mkdis

install:V: 	install-logs-$SHELLTYPE

install-logs-rc install-logs-nt:V:
	for (i in $LOGS){
		rm -f $ROOT/services/httpd/$i && cp $i $ROOT/services/httpd/$i
	}
	# chmod 644 $ROOT/services/httpd/httpd.log

install-logs-sh:V:
	for i in $LOGS
	do
		rm -f $ROOT/services/httpd/$i && cp $i $ROOT/services/httpd/$i
	done
	# chmod 644 $ROOT/services/httpd/httpd.log

Deleted appl/svc/httpd/parser.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593

















































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Parser;

include "sys.m";
	sys: Sys;
include "draw.m";
	draw: Draw;
include "bufio.m";
include "string.m";
	str: String;
include "daytime.m";
	daytime: Daytime;
include "contents.m";
	contents : Contents;
	Content: import contents;
include "cache.m";
include "httpd.m";
	Private_info: import Httpd;
	Internal, TempFail, Unimp, UnkVers, BadCont, BadReq, Syntax, 
	BadSearch, NotFound, NoSearch , OnlySearch, Unauth, OK : import Httpd;	
include "parser.m";
include "date.m";
	date : Date;
include "alarms.m";
	alarms: Alarms;
	Alarm: import alarms;
include "lock.m";
	locks: Lock;
	Semaphore: import locks;

Error: adt {
	num : string;
	concise: string;
	verbose: string;
};

errormsg := array[] of {
	Internal => Error("500 Internal Error", "Internal Error",
		"This server could not process your request due to an interal error."),
	TempFail =>	Error("500 Internal Error", "Temporary Failure",
		"The object %s is currently inaccessible.<p>Please try again later."),
	Unimp =>	Error("501 Not implemented", "Command not implemented",
		"This server does not implement the %s command."),
	UnkVers =>	Error("501 Not Implemented", "Unknown http version",
		"This server does not know how to respond to http version %s."),
	BadCont =>	Error("501 Not Implemented", "Impossible format",
		"This server cannot produce %s in any of the formats your client accepts."),
	BadReq =>	Error("400 Bad Request", "Strange Request",
		"Your client sent a query that this server could not understand."),
	Syntax =>	Error("400 Bad Request", "Garbled Syntax",
		"Your client sent a query with incoherent syntax."),
	BadSearch =>Error("400 Bad Request", "Inapplicable Search",
		"Your client sent a search that cannot be applied to %s."),
	NotFound =>Error("404 Not Found", "Object not found",
		"The object %s does not exist on this server."),
	NoSearch =>	Error("403 Forbidden", "Search not supported",
		"The object %s does not support the search command."),
	OnlySearch =>Error("403 Forbidden", "Searching Only",
		"The object %s only supports the searching methods."),
	Unauth =>	Error("401 Unauthorized", "Unauthorized",
		"You are not authorized to see the object %s."),
	OK =>	Error("200 OK", "everything is fine","Groovy man"),
};	

badmodule(p: string)
{
	sys->fprint(sys->fildes(2), "parse: cannot load %s: %r", p);
	raise "fail:bad module";
}

lock: ref Semaphore;

init()
{
	sys = load Sys Sys->PATH;

	date = load Date Date->PATH;
	if (date==nil) badmodule(Date->PATH);

	daytime = load Daytime Daytime->PATH;
	if(daytime == nil) badmodule(Daytime->PATH);

	contents = load Contents Contents->PATH;
	if(contents == nil) badmodule(Contents->PATH);

	str = load String String->PATH;
	if(str == nil) badmodule(String->PATH);

	alarms = load Alarms Alarms->PATH;
	if(alarms == nil) badmodule(Alarms->PATH);

	locks = load Lock Lock->PATH;
	if(locks == nil) badmodule(Lock->PATH);
	locks->init();
	lock = Semaphore.new();
	date->init();
}

atexit(g: ref Private_info)
{
	if (g.dbg_log!=nil){
		sys->fprint(g.dbg_log,"At exit from parse, closing fds. \n");
	}
	if (g.bin!=nil)
		g.bufio->g.bin.close();
	if (g.bout!=nil)
		g.bufio->g.bout.close();
	g.bin=nil;
	g.bout=nil;
	exit;
}


httpheaders(g: ref Private_info,vers : string)
{
	if(vers == "")
		return;
	g.tok = '\n';
	# 15 minutes to get request line
	a := Alarm.alarm(15*1000*60); 
	while(lex(g) != '\n'){
		if(g.tok == Word && lex(g) == ':'){
			if (g.dbg_log!=nil)
				sys->fprint(g.dbg_log,"hitting parsejump. wordval is %s\n",
										g.wordval);
			parsejump(g,g.wordval);
		}
		while(g.tok != '\n')
			lex(g);
	}
	a.stop();
}


mimeok(g: ref Private_info,name : string,multipart : int,head : list of ref Content): list of ref Content
{

	generic, specific, s : string;
	v : real;

	while(lex(g) != Word)
		if(g.tok != ',')
			return head;

	generic = g.wordval;
	lex(g);
	if(g.tok == '/' || multipart){
		if(g.tok != '/')
			return head;
		if(lex(g) != Word)
			return head;
		specific = g.wordval;
		lex(g);
	}else
		specific = "*";
	tmp := contents->mkcontent(generic, specific);
	head = tmp::head;
	for(;;){
		case g.tok {
		';' =>
			if(lex(g) == Word){
				s = g.wordval;
				if(lex(g) != '=' || lex(g) != Word)
					return head;
				v = 3.14; # should be strtof(g.wordval, nil);
				if(s=="q")
					tmp.q = v;
				else
					logit(g,sys->sprint(
						"unknown %s param: %s %s",
						name, s, g.wordval));
			}
			break;
		',' =>
			return  mimeok(g,name, multipart,head);
		* =>
			return head;
		}
		lex(g);
	}
	return head;
}

mimeaccept(g: ref Private_info,name : string)
{
	g.oktype = mimeok(g,name, 1, g.oktype);
}

mimeacceptenc(g: ref Private_info,name : string)
{
	g.okencode = mimeok(g,name, 0, g.okencode);
}

mimeacceptlang(g: ref Private_info,name : string)
{
	g.oklang = mimeok(g,name, 0, g.oklang);
}

mimemodified(g: ref Private_info,name : string)
{
	lexhead(g);
	g.modtime = date->date2sec(g.wordval);
	if (g.dbg_log!=nil){
		sys->fprint(g.dbg_log,"modtime %d\n",g.modtime);
	}
	if(g.modtime == 0)
		logit(g,sys->sprint("%s: %s", name, g.wordval));
}


mimeagent(g: ref Private_info,nil : string)
{
	lexhead(g);
	g.client = g.wordval;
}

mimefrom(g: ref Private_info,nil : string)
{
	lexhead(g);
}


mimehost(g: ref Private_info,nil : string)
{
	h : string;
	lexhead(g);
	(nil,h)=str->splitr(g.wordval," \t");
	g.host = h;
}

mimereferer(g: ref Private_info,nil : string)
{
	h : string;
	lexhead(g);
	(nil,h)=str->splitr(g.wordval," \t");
	g.referer = h;
}

mimeclength(g: ref Private_info,nil : string)
{
	h : string;
	lexhead(g);
	(nil,h)=str->splitr(g.wordval," \t");
	g.clength = int h;
}

mimectype(g: ref Private_info,nil : string)
{
	h : string;
	lexhead(g);
	(nil,h)=str->splitr(g.wordval," \t");
	g.ctype = h;
}


mimeignore(g: ref Private_info,nil : string)
{
	lexhead(g);
}


mimeunknown(g: ref Private_info,name : string)
{
	lexhead(g);
	if(g.client!="")
		logit(g,sys->sprint("agent %s: ignoring header %s: %s ", 
			g.client, name, g.wordval));
	else
		logit(g,sys->sprint("ignoring header %s: %s", name, g.wordval));
}


parsejump(g: ref Private_info,k : string)
{
	case k { 

	"from" =>		
		mimefrom(g,k);
	"if-modified-since" =>	
		mimemodified(g,k);
	"accept" =>		
		mimeaccept(g,k);
	"accept-encoding" =>	
		mimeacceptenc(g,k);
	"accept-language" =>	
		mimeacceptlang(g,k);
	"user-agent" =>		
		mimeagent(g,k);
	"host" =>		
		mimehost(g,k);
	"referer" =>		
		mimereferer(g,k);
	"content-length" =>
		mimeclength(g,k);
	"content-type" =>
		mimectype(g,k);
	"authorization" or "chargeto" or "connection" or "forwarded" or
	"pragma" or "proxy-agent" or "proxy-connection" or
	"x-afs-tokens" or "x-serial-number" =>	
		mimeignore(g,k);
	* =>				
		mimeunknown(g,k);
	};	
}

lex(g: ref Private_info): int
{
	g.tok = lex1(g);
	return g.tok;
}


# rfc 822/rfc 1521 lexical analyzer
lex1(g: ref Private_info): int
{
	level, c : int;
	if(g.parse_eof)
		return '\n';

# top:
	for(;;){
		c = getc(g);
		case c {
			 '(' =>
				level = 1;
				while((c = getc(g)) != Bufio->EOF){
					if(c == '\\'){
						c = getc(g);
						if(c == Bufio->EOF)
							return '\n';
						continue;
					}
					if(c == '(')
						level++;
					else if(c == ')' && level == 1){
						level--;
						break;
					}
					else if(c == '\n'){
						c = getc(g);
						if(c == Bufio->EOF)
							return '\n';
							break;
						if(c != ' ' && c != '\t'){
							ungetc(g);
							return '\n';
						}
					}
				}
	 		' ' or '\t' or '\r' =>
				break;
	 		'\n' =>
				if(g.tok == '\n'){
					g.parse_eof = 1;
					return '\n';
				}
				c = getc(g);
				if(c == Bufio->EOF)
					return '\n';
				if(c != ' ' && c != '\t'){
					ungetc(g);
					return '\n';
				}
			')' or '<' or '>' or '[' or ']' or '@' or '/' or ',' 
			or ';' or ':' or '?' or '=' =>
				return c;

	 		'"' =>
				word(g,"\"");
				getc(g);		# skip the closing quote 
				return Word;

	 		* =>
				ungetc(g);
				word(g,"\"()<>@,;:/[]?=\r\n \t");
				return Word;
			}
	}
	return 0;	
}

# return the rest of an rfc 822, not including \r or \n
# do not map to lower case

lexhead(g: ref Private_info)
{
	c, n: int;
	n = 0;
	while((c = getc(g)) != Bufio->EOF){
		if(c == '\r')
			c = wordcr(g);
		else if(c == '\n')
			c = wordnl(g);
		if(c == '\n')
			break;
		if(c == '\\'){
			c = getc(g);
			if(c == Bufio->EOF)
				break;
		}
		g.wordval[n++] = c;
	}
	g.tok = '\n';
	g.wordval= g.wordval[0:n];
}

word(g: ref Private_info,stop : string)
{
	c : int;
	n := 0;
	while((c = getc(g)) != Bufio->EOF){
		if(c == '\r')
			c = wordcr(g);
		else if(c == '\n')
			c = wordnl(g);
		if(c == '\\'){
			c = getc(g);
			if(c == Bufio->EOF)
				break;
		}else if(str->in(c,stop)){
				ungetc(g);
				g.wordval = g.wordval[0:n];	
				return;
			}
		if(c >= 'A' && c <= 'Z')
			c += 'a' - 'A';
		g.wordval[n++] = c;
	}
	g.wordval = g.wordval[0:n];
	# sys->print("returning from word");
}


wordcr(g: ref Private_info): int
{
	c := getc(g);
	if(c == '\n')
		return wordnl(g);
	ungetc(g);
	return ' ';
}


wordnl(g: ref Private_info): int
{
	c := getc(g);
	if(c == ' ' || c == '\t')
		return c;
	ungetc(g);
	return '\n';
}


getc(g: ref Private_info): int
{
	c := g.bufio->g.bin.getc();
	if(c == Bufio->EOF){
		g.parse_eof = 1;
		return c;
	}
	return c & 16r7f;
}

ungetc(g: ref Private_info)
{
	# this is a dirty hack, I am tacitly assuming that characters read
	# from stdin will be ASCII.....
	g.bufio->g.bin.ungetc();
}

# go from url with ascii and %xx escapes to unicode, allowing for existing unencoded utf-8

urlunesc(s : string): string
{
	a := array[Sys->UTFmax*len s] of byte;
	o := 0;
	for(i := 0; i < len s; i++){
		c := int s[i];
		if(c < Runeself){
			if(c == '%' && i+2 < len s){
				d0 := hex(int s[i+1]);
				if(d0 >= 0){
					d1 := hex(int s[i+2]);
					if(d1 >= 0){
						i += 2;
						c = d0*16 + d1;
					}
				}
			} else if(c == '+'  || c == 0)
				c = ' ';
			a[o++] = byte c;
		}else
			o += sys->char2byte(c, a, o);
	}
	return string a[0: o];
}

hex(c: int): int
{
	if(c >= '0' && c <= '9')
		return c-'0';
	if(c >= 'a' && c <= 'f')
		return c-'a' + 10;
	if(c >= 'A' && c <= 'F')
		return c-'A' + 10;
	return -1;
}

# write a failure message to the net and exit
fail(g: ref Private_info,reason : int, message : string)
{
	verb : string;
	title:=sys->sprint("<head><title>%s</title></head>\n<body bgcolor=#ffffff>\n",
					errormsg[reason].concise);
	body1:=	"<h1> Error </h1>\n<P>" +
		"Sorry, Charon is unable to process your request. The webserver reports"+
		" the following error <P><b>";
	#concise error
	body2:="</b><p>for the URL\n<P><b>";
	#message
	body3:="</b><P>with the following reason:\n<P><b>";
	#reason
	if (str->in('%',errormsg[reason].verbose)){
		(v1,v2):=str->splitl(errormsg[reason].verbose,"%");
		verb=v1+message+v2[2:];
	}else
		verb=errormsg[reason].verbose;
	body4:="</b><hr> This Webserver powered by <img src=\"/inferno.gif\">. <P>"+
		"For more information click <a href=\"http://inferno.lucent.com\"> here </a>\n"+
		"<hr><address>\n";
	dtime:=sys->sprint("This information processed at %s.\n",daytime->time());
	body5:="</address>\n</body>\n";
	strbuf:=title+body1+errormsg[reason].concise+body2+message+body3+
		verb+body4+dtime+body5;
	if (g.bout!=nil && reason!=2){
		g.bufio->g.bout.puts(sys->sprint("%s %s\r\n", g.version, errormsg[reason].num));
		g.bufio->g.bout.puts(sys->sprint("Date: %s\r\n", daytime->time()));
		g.bufio->g.bout.puts(sys->sprint("Server: Charon\r\n"));
		g.bufio->g.bout.puts(sys->sprint("MIME-version: 1.0\r\n"));
		g.bufio->g.bout.puts(sys->sprint("Content-Type: text/html\r\n"));
		g.bufio->g.bout.puts(sys->sprint("Content-Length: %d\r\n", len strbuf));
		g.bufio->g.bout.puts(sys->sprint("\r\n"));
		g.bufio->g.bout.puts(strbuf);
		g.bufio->g.bout.flush();
	}
	logit(g,sys->sprint("failing: %s", errormsg[reason].num));
	atexit(g);
}


# write successful header
 
okheaders(g: ref Private_info)
{
	g.bufio->g.bout.puts(sys->sprint("%s 200 OK\r\n", g.version));
	g.bufio->g.bout.puts("Server: Charon\r\n");
	g.bufio->g.bout.puts("MIME-version: 1.0\r\n");
}

notmodified(g: ref Private_info)
{
	g.bufio->g.bout.puts(sys->sprint("%s 304 Not Modified\r\n", g.version));
	g.bufio->g.bout.puts("Server: Charon\r\n");
	g.bufio->g.bout.puts("MIME-version: 1.0\r\n\r\n");
	atexit(g);
}

logit(g: ref Private_info,message : string )
{
	lock.obtain();
	sys->fprint(g.logfile,"%s %s\n", g.remotesys, message);
	lock.release();
}

urlconv(p : string): string
{
	a := array[Sys->UTFmax] of byte;
	t := "";
	for(i := 0; i < len p; i++){
		c := p[i];
		if(c == 0)
			continue;	# ignore nul bytes
		if(c >= Runeself){	# convert to UTF-8
			n := sys->char2byte(c, a, 0);
			for(j := 0; j < n; j++)
				t += sys->sprint("%%%.2X", int a[j]);
		}else if(c <= ' ' || c == '%'){
			t += sys->sprint("%%%2.2X", c);
		} else {
			t[len t] = c;
		}
	}
	return t; 
}

Deleted appl/svc/httpd/parser.m.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parser: module {
	Runeself : con 	16r80;
	Word : con 1;

	PATH:  		con	"/dis/svc/httpd/parser.dis";

	init: fn();
	urlunesc: fn(s: string): string;
	fail: fn(g: ref Httpd->Private_info,reason: int, message: string);
	logit: fn(g: ref Httpd->Private_info, message: string );
	notmodified: fn(g: ref Httpd->Private_info);
	httpheaders: fn(g: ref Httpd->Private_info, vers: string);
	urlconv: fn(url : string): string;
	okheaders: fn(g: ref Httpd->Private_info);
};

Deleted appl/svc/httpd/redirect.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130


































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Redirect;

include "sys.m";
	sys : Sys;

include "bufio.m";
	bufio : Bufio;
Iobuf : import bufio; 

include "string.m";	
	str : String;

include "redirect.m";

HASHSIZE : con 1019;


Redir: adt{
	pat, repl : string;
};

tab := array[HASHSIZE] of list of Redir;


hashasu(key : string,n : int): int
{
        i,h : int;
	i=0;
	h=0;
        while(i<len key){
                h = 10*h + key[i];
		h%= n;
		i++;
	}
        return h;
}

insert(pat, repl : string)
{
	hash := hashasu(pat,HASHSIZE);
	tab[hash]= Redir(pat, repl) :: tab[hash];
}

redirect_init(file : string)
{
	sys = load Sys Sys->PATH;
	line : string;
	flist : list of string;
	n : int;
	bb : ref Iobuf;
	for(n=0;n<HASHSIZE;n++)
		tab[n]= nil; 
	stderr := sys->fildes(2);
	bufio = load Bufio Bufio->PATH;	
	if (bufio==nil){
		sys->fprint(stderr,"redirect: cannot load %s: %r\n", Bufio->PATH);
		raise "fail:bad module";
	}
	str = load String String->PATH;	
	if (str==nil){
		sys->fprint(stderr,"redirect: cannot load %s: %r\n", String->PATH);
		raise "fail:bad module";
	}
	bb = bufio->open(file,bufio->OREAD);
	if (bb==nil)
		return;
	while((line = bb.gets('\n'))!=nil){
		line = line[0:len line -1]; #chop newline 
		if (str->in('#',line)){
			(line,nil) = str->splitl(line, "#");
			if (line!=nil){
				n = len line;
				while(line[n]==' '||line[n]=='\t') n--; 
					 # and preceeding blanks 
				line = line[0:n];
			}
		}
		if (line!=nil){
			(n,flist)=sys->tokenize(line,"\t ");
			if (n==2)
				insert(hd flist,hd tl flist);
		}
	}
	
}

lookup(pat : string):  ref Redir
{
	srch : list of Redir;
	tmp :  Redir;
	hash : int;
	hash = hashasu(pat,HASHSIZE);
	for(srch = tab[hash]; srch!=nil; srch = tl srch){
		tmp =  hd srch;
		if(tmp.pat==nil)
			return nil;
		if(pat==tmp.pat)
			return ref tmp;
	}
	return nil;
}


redirect(path : string): string {
	redir :  ref Redir;
	newpath, oldp : string;
	s : int;
	if((redir = lookup(path))!=nil)
		if(redir.repl==nil)
			return nil;
		else
			return redir.repl;
	for(s = len path - 1; s>0; s--){
		if(path[s]=='/'){
			oldp = path[s+1:];
			path = path[0:s];	
			if((redir = lookup(path))!=nil){
				if(redir.repl!=nil)
					newpath=sys->sprint("%s/%s",
						redir.repl,oldp);
				else
					newpath = nil;
				path = path+"/"+oldp;
				return newpath;
			}
			path = path+"/"+oldp;
		}
	}
	return nil;
}

Deleted appl/svc/httpd/redirect.m.

1
2
3
4
5
6
7







-
-
-
-
-
-
-
Redirect: module
{
	PATH: con "/dis/svc/httpd/redirect.dis";

	redirect_init: fn(file : string);
	redirect: fn(path : string): string;
};

Deleted appl/svc/httpd/stats.b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85





















































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
implement Stats;

include "sys.m";
	sys : Sys;

include "bufio.m";
	bufio: Bufio;
	Iobuf: 	import bufio;

include "draw.m";
	draw: Draw;

include "contents.m";
include "cache.m";
	cache : Cache;

include "httpd.m";
	Private_info: import Httpd;

include "date.m";
	date : Date;

include "parser.m";
	pars : Parser;

include "daytime.m";
	daytime: Daytime;

Stats: module
{
	init: fn(g : ref Private_info, req: Httpd->Request);
};

badmod(p: string)
{
	sys->fprint(sys->fildes(2), "stats: cannot load %s: %r\n", p);
	raise "fail:bad module";
}

init(k : ref Private_info, req: Httpd->Request)
{	
	sys = load Sys "$Sys";
	draw = load Draw "$Draw";
	
	daytime = load Daytime Daytime->PATH;
	if(daytime == nil) badmod(Daytime->PATH);

	pars = load Parser Parser->PATH;
	if(pars == nil) badmod(Parser->PATH);

	date = load Date Date->PATH;
	if(date == nil) badmod(Date->PATH);

	date->init();
	bufio=k.bufio;
	send(k, req.method, req.version, req.uri, req.search);
}

send(g: ref Private_info, meth, vers, uri, search : string)
{
	if(meth=="");
	if(uri=="");
	if(search=="");
	if(vers != ""){
		if (g.version == nil)
			sys->print("stats: version is unknown.\n");
		g.bout.puts(sys->sprint("%s 200 OK\r\n", g.version));
		g.bout.puts("Server: Charon\r\n");
		g.bout.puts("MIME-version: 1.0\r\n");
		g.bout.puts(sys->sprint("Date: %s\r\n", date->dateconv(daytime->now())));
		g.bout.puts("Content-type: text/html\r\n");
		g.bout.puts(sys->sprint("Expires: %s\r\n", date->dateconv(daytime->now())));
		g.bout.puts("\r\n");
	}
	g.bout.puts("<head><title>Cache Information</title></head>\r\n");
	g.bout.puts("<body><h1>Cache Information</h1>\r\n");
	g.bout.puts("These are the pages stored in the server cache:<p>\r\n");
	lis:=(g.cache)->dump();
	while (lis!=nil){
		(a,b,d):=hd lis;
		g.bout.puts(sys->sprint("<a href=\"%s\"> %s</a> \t size %d \t tag %d.<p>\r\n",a,a,b,d));
		lis = tl lis;
	}
	g.bout.flush();
}

Changes to appl/svc/mkfile.

1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
1
2
3

4
5
6
7
8
9
10
11
12
13
14
15



-




+







<../../mkconfig

DIRS=\
	httpd\
	webget\

SHTARG=\
	auth.sh\
	httpd.sh\
	net.sh\
	registry.sh\
	rstyx.sh\
	styx.sh\

BIN=$ROOT/dis/svc

Changes to appl/wm/man.b.

23
24
25
26
27
28
29

30
31
32
33
34





35
36
37
38
39
40
41
23
24
25
26
27
28
29
30





31
32
33
34
35
36
37
38
39
40
41
42







+
-
-
-
-
-
+
+
+
+
+








window: ref Tk->Toplevel;

W: adt {
	textwidth: fn(nil: self ref W, text: Text): int;
};

# TODO theme support
ROMAN: con "/fonts/lucidasans/unicode.7.font";
BOLD: con "/fonts/lucidasans/typelatin1.7.font";
ITALIC: con "/fonts/lucidasans/italiclatin1.7.font";
HEADING1: con "/fonts/lucidasans/boldlatin1.7.font";
HEADING2: con "/fonts/lucidasans/italiclatin1.7.font";
ROMAN: con "/fonts/hermit/regular/16/font";
BOLD: con "/fonts/hermit/bold/16/font";
ITALIC: con "/fonts/hermit/regularitalic/16/font";
HEADING1: con "/fonts/hermit/bold/16/font";
HEADING2: con "/fonts/hermit/bolditalic/16/font";
rfont, bfont, ifont, h1font, h2font: ref Font;

GOATTR: con Parseman->ATTR_LAST << iota;
MANPATH: con "/man/1/man";
INDENT: con 40;

metrics: Parseman->Metrics;

Changes to appl/wm/sh.b.

223
224
225
226
227
228
229



230
231
232
233
234
235
236
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239







+
+
+







	for (i := 0; i < len shwin_cfg; i++)
		cmd(t, shwin_cfg[i]);
	(menuw, nil) := itemsize(t, ".m");
	if (font != nil) {
		if (font[0] != '/' && (len font == 1 || font[0:2] != "./"))
			font = "/fonts/" + font;
		cmd(t, ".ft.t configure -font " + font);
	} else { # TODO theme support
		font = "/fonts/BQN386/16/font";
		cmd(t, ".ft.t configure -font " + font);
	}
	cmd(t, ".ft.t configure -width 65w -height 20h");
	cmd(t, "pack propagate . 0");
	if(width != nil)
		cmd(t, ". configure -width " + width);
	if(height != nil)
		cmd(t, ". configure -height " + height);

Added dis/svc/httpd.



1
2
+
+
#!/dis/sh
/dis/ip/shttpd -h -n /services/httpd/config.db

Deleted dis/svc/httpd/.keep.

Added doc/docs.txt.



1
2
+
+
message headers (also other protocols than http):
http://www.iana.org/assignments/message-headers/message-header-index.html

Added doc/http.txt.












































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
note: this document is not finished yet

# introduction

this document contains comments on the http/1.1 specification, as in rfc2616.  it also attempts to provide pointers for implementors, by showing common pitfalls, minimum requirements for implementations (and parts of the specification that can be skipped while remaining compliant), problems/ambiguities in the specification, examples.  this is not (yet) a full introduction to http/1.1, it may become one in the future.

first an example of a contemporary http/1.1 transaction.  sent from a firefox 2.0.0.x client to a lighttpd 1.4.x server.  first the request:

	GET / HTTP/1.1
	Host: www.ueber.net
	User-Agent: Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.6) Gecko/20070819 Firefox/2.0.0.6
	Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
	Accept-Language: en-us,en;q=0.5
	Accept-Encoding: gzip,deflate
	Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
	Keep-Alive: 300
	Connection: keep-alive
	

and the response:

	HTTP/1.1 200 OK
	Content-Type: text/html; charset=utf-8
	ETag: "6646323153445497512"
	Accept-Ranges: bytes
	Last-Modified: Sat, 24 Feb 2007 16:35:45 GMT
	Content-Length: 590
	Date: Fri, 14 Dec 2007 13:38:16 GMT
	Server: lighttpd/1.4.13
	
	[590 bytes of body]


as for the request.  the first line is a method (`GET`), a path (`/`) and the http version (`HTTP/1.1`).  each separated by a single space.  lines end with CRLF, but servers should be permissive and accept a LF instead of CRLF as well.  next follow the headers, typically one per line, the colon separates the name from the value.  practically always, leading and trailing whitespace can be removed.  an empty line ends the headers.  if a body is present it follows the empty line immediately.  the length of the body is determined by the headers.

the response is very similar.  only the first line is different:  it consists of the version (`HTTP/1.1`), followed by a 3-digit status code (`200`), followed by a descriptive message (`OK`).  the message leads to the end of the line and is allowed to contain spaces.  the three elements are again separated by a single space.  the body follows the empty line after the headers immediately, just like with a request.  some headers can occur only in requests, some only in responses, some in both.  some headers that are allowed in both have differing semantics based on whether they are used in a request or response.

the most common requests use the methods `GET` and `POST`.  other methods, namely `HEAD`, `OPTIONS` and `TRACE` are used much less.  `PUT` and `DELETE` are not normally used in browsers, browsers just download things.  more methods have been specified for e.g. WEBDAV.  `PUT` and `DELETE` are mostly used with WEBDAV by the way.  http/1.1 also specifies `CONNECT`, which is a bit special:  it makes the http proxy/server forward the current tcp connection to some random ip:port;  used for doing the secure "https" through a proxy.

in general, http gets complex very quickly due to the state-explosive combinations of requests, response statuses and the many headers.  the specification tries to describe behaviour such that new methods and headers can be specified.  unfortunately, new methods and headers can easily introduce inconsistencies.

those who consider a solution to many problems, please read the following rfcs and documents:

* rfc3143, "Known HTTP Proxy/Caching Problems"
* rfc3205, "On the use of HTTP as a Substrate"
* http://www.usenix.org/events/usenix99/invited_talks/mogul.pdf, "What’s wrong with HTTP (and why it doesn't matter)"

or in short: try to avoid http where you can.


# on http headers in general

headers are of the form `field: value`.  whitespace (space/tab, or crlf followed by at least one space/tab) can, but does not have to occur before the value.  so these are all equivalent:

	Content-Length:<sp>123<crlf>
	Content-Length:123<sp><tab><crlf>
	Content-Length:<sp><tab><sp>123<crlf>
	Content-Length: <crlf>
	<sp><tab>123<sp><sp><crlf>

in general, whitespace can occur between tokens that make up a header, unless specically specified as not allowed.  some headers where this is not allowed: `Date` (precisely specified), `Content-Type` (actually, only the media-type in the content type).  whitespace has no meaning, it just serves to separate tokens and readability.

headers aren't really hard, although the way they are specified leaves it a bit unclear how complext it is going to get.  for example, section 2.2 "basic rules" specify `comments` for headers, i.e. data with parentheses.  and comments can be nested.  parsing this with simple string functions isn't nice.  luckily, after reading the specification you'll know that only a few headers are allowed to have headers (in others, the parenteses are simply part of the value).  the headers are: `Via`, `Server`, `User-Agent`.  all headers for which the value doens't have important semantics.

then about the headers whose values consists of comma-separated elements.  these are specified in bnf as `#rule`, meaning zero or more `rule`'s separated by comma's (and lws in between).  the special trick is that multiple headers with the same name may be present, and should be concatenated (with a comma as separator) when handling that header.  about duplicate header names for other headers the specification is silent.  it may be a good idea to treat duplicate headers with known semantics which don't consist of comma-separated values as invalid (i.e. respond with 400 "bad request" if a server encounters it in a request).  the order in which the headers occur is important.  the `#rule`-headers are: `Accept`, `Accept-Charset`, `Accept-Encoding`, `Accept-Language`, `Allow`, `Cache-Control`, `Connection`, `Content-Encoding`, `Content-Language`, `Expect`, `Pragma`, `Proxy-Authenticate`, `TE`, `Trailer`, `Transfer-Encoding`, `Upgrade`, 

note that some headers partially consist of `#rule`-values, but may (partially) consist of other values too.  these are not allowed to be merged.  these headers are: `Accept-Ranges`, `If-Match`, `If-None-Match`, `Vary`, `Via`, `Warning`, `WWW-Authenticate`.

some header values can be "quoted-strings": double quotes around any character except controls and the double quote.  in http/1.0 that was it.  in http/1.1 quoted-string parsing has changed, a backslash is now allowed to escape a double quote.  thus, interpretation of headers should be done based on the http version of the request.


# connections

keeping connections alive after a request is an important feature in http/1.1 compared to http/1.0.  by default, http/1.1 connections are keep-alive connections.  so, after a request another request can follow.  when either the request or the response contains a `Connection: close` header, the connection will close after the response has come in.  


# entity

a _request_ has an entity when either a `Content-Length` or `Transfer-Encoding` header is present.

whether a _response_ has an entity is based on request method and response status code.  section 4.3 "message body" tells us responses to a `HEAD` request do never have bodies, even if there are headers such as `Content-Length` that suggest otherwise.  the section also tells all 1xx, 204 "no content" and 304 "not modified" responses to not have bodies.  all other responses do have bodies (though maybe of zero length).

for requests, only POST and PUT normally have bodies.  OPTIONS is allowed to have a body has well, for future compatibility.  it's semantics are undefined, so it is best not used.  rfc2616 suggests that such a body is discarded.  this is best done by simply closing the connection after reading having sent the response.  this prevents the incoming data to be regarded as a request.

now for the length of the entity if it is present.  first, if `Transfer-Encoding` has a value other than `identity`, the response is in chunked mode, which is self-delimiting.  if a `Content-Length` is present, it is the length in bytes.  note that both headers should not be present in a single request/response;  if they are, `Content-Length` must be ignored.  this strikes me as odd:  if `Transfer-Encoding: identity` is present, how would you determine the length?  next section 4.4 "message length" describes that a `Content-Type` with media-type `multipart/byteranges` is self-delimiting and thus doesn't need a `Transfer-Encoding` or `Content-Length`.  they could have just required chunked transfer-encoding for that case... the last way of determining the length, only when none of the just mentioned methods apply, is to simply read to end of file.  this is mostly for http/1.0 backwards compatibility but is also used between http/1.1-only transactions.  actually, this last method is quite unsatisfactory:  it doesn't allow detecting if a remote server is shutdown (causing its tcp connections to close, i.e. without timing out).


# forward compatibility

rfc2616 sprinkles information on how unrecognized http versions, methods, response statuses, header names and header values should be handled throughout the specification.  the goal is to allow future http versions/extensions to be specified without breaking older clients.  this section contains this data.

1. unknown http versions (section 3.1 "http version").  a higher minor version implies newer message semantics but **not** new message parsing algorithms.  i.e. the new version may have new headers.  the new version will probably be specified such that http/1.1 interpreters of the message will stuff handle the message correctly.  a higher major version implies new message parsing semantics.  thus, if the server is even able to detect the http version in the message with a new major version (a new specification will probably make sure it is), it cannot assume it correctly parsed the message and thus must respond with 505 "http version not supported".  a request in unknown minor version should probably be handled as the highest known minor version understood.  care must be taken to respond properly to unknown values in headers.  the specification explicitly defines what to do for some headers.  unfortuantely, in practice all bets are probably off:  the http/1.0 specification prescribes practically the same, but still http/1.1 messages are parsed differently (chunked encoding isn't present in http/1.0) and the major version number has not been incremented.

2. unknown http methods (section 5.1.1, "method").  methods that are specified but not implemented (e.g. `PUT`), or not completely unrecognized must be responded to with 501 "not implemented".

3. unknown http header names.  this one is easy, unrecognized names should simply be ignored.  this is an explicit forward-compatibility thing.

4. unknown http header values.  this is one is much more tricky.  some headers with invalid values should be ignored.  xxx should some be responded to with a "bad request"?  for some header names a few values are specified and extension values are explicitly allowed in the BNF.  how to handle these unknown values varies.  how invalid values should be handled isn't always clear as well.  the next listing attempts to provide sane defaults.

	* `If-Modified-Since` and `If-Unmodified-Since`: if the date is invalid, it should be ignored.  i think 400 "bad request" would have been better.
	* `Cache-Control` explictly allows extensions.  they are supposedly designed such that they can be ignored.  the extension is supposed to override the default caching directives that apply or are specified in the header for backwards compatibility.  too bad, cache-control is already too complex.
	* `Content-Encoding` implies a 415 "unsupported media type" should be sent for unknown encodings.  unknown encodings aren't really allowed, all valid encodings are specified in section 3.5.
	* `Content-Length`, although 14.13 doesn't say what to do for invalid values, the only proper interpration is "bad request" or "bad response".
	* `Content-Type`, again, sections 14.17 and 7.2.1 do not specify how to handle invalid values.  if the content-type is not specified, it can safely be assumed to be application/octet-stream (which can be responded to with 415 "unsupported media type").  if the value is syntactically invalid, it should probably be treated as a 400 "bad request".
	* `Expect`:  the only value specified is `100-continue`.  if the value is unknown, an error should be returned according to section 14.20.  400 "bad request" seems appropriate.  if the value is known but cannot be met, 417 "expectation failed" applies.
	* `Host`: this header must be present in all requests.  the really silly thing:  if the host is not a valid host on the server (i.e. the server doesn't know the host), a 400 "bad request" must be returned.  404 "file not found" sounds so much better, there is nothing "bad" about the request.
	* `If-Match`: section 14.24, typically used to safely overwrite a file with a `PUT` request.  bad values should be responded to with 400 "bad request" to be safe.  The same goes for `If-Modified-Since` from section 14.28.
	* `Transfer-Encoding`:  section 14.41.  again, nothing is said about unknown encodings.  however, if you don't understand how a message if formed, the only useful action seems to be not to interpret it.  400 "bad request" probably comes closest.
	* `Vary`:  section 14.44, again nothing specified about invalid values.  the safe option seems to treat the value as `*`, the most restrictive and safe value.
	* many other headers are optional.  e.g. `Date`, `ETag`, `If-None-Match, `Last-Modified` only provide additional services (caching).  `Range` provides partial file serving.  if they are invalid, they are safe to igore.  in my opinion it is usually better to point the program to its error rather than guessing what the programs intentions were, but that is not what the specification says.

# minimal implementation & http in practice

bad for us:  the http/1.1 specification is pretty large.
good for us:  we can safely ignore parts of it.  and some parts are only for clients, proxies and/or servers.

as for methods, only `GET` and `HEAD` are mandatory.  a webserver without `POST` is crippled.  `OPTIONS` and `TRACE` aren't very useful but aren't that hard to implement either.

## ignorable headers

we can cut a lot more in headers we need to support.  first, headers that are completely irrelevant to servers:  `Age`, `Max-Forwards`, `Proxy-Authenticate`, `Via`, `Warning`.  these are only for caches (e.g. proxies).

next, some incoming headers have no influence on responses and can safely be ignored: `From`, `Referer`, `User-Agent`.  these may be useful for logging in their raw form.

now, yet another set of headers "should" or "may" be handled, but are not (useful) in practice: `Accept`, `Accept-Charset`, `Accept-Encoding`, `Accept-Language`, `Content-Location`, `Content-MD5`, `TE`, `Upgrade`.

## mandatory/useful headers

then, another set of headers are only generated by servers, not received.  generating headers is usually far easier to implement than parsing them.  they are:  `Allow`, `Accept-Ranges`, `ETag`, `Expires`, `Last-Modified`, `Location`, `Server`, `Vary`, `WWW-Authenticate`.  these headers can be generated by both clients and servers, but the server can ignore them when they come from a client:  `Date`, `Cache-Control`, `Pragma`, `Trailer`.

headers that clients send but can safely be ignored, but are quite useful and recommended to be implemented: `Authorization`, `If-Modified-Since`, `If-None-Match`, `If-Range`, `Range`.  note: `Content-Range` is also only generated by a server, though not entirely trivial.  it is a response to the `Range` header.

headers that clients send and really really should be implemented (perhaps partially): `Connection`, `Content-Encoding`, `Content-Length`, `Content-Type`, `Expect`, `Host`, `If-Match`, `If-Unmodified-Since`, `Transfer-Encoding`.

for security, some headers should be handled specially.  when a `Proxy-Authorization` is sent to a server it should respond with 400 "bad request", this should just never happen.  when a `Authorization` header is sent for a path on a server that doesn't need authentication, it should only be accepted when the user/pass are empty strings;  for anything else, a 401 "unauthorized" should be send.  note that is not specified by the specification but should protect users from spewing their credentials around.

# on specific headers

## `Connection`

if one of the values (it is a comma-separated list) is `close`, the connection will be closed.  the response should also include a `Connection: close` header.  other values can safely be ignored.

## `Content-Encoding`

the server can generated this, e.g. for sending compressed data.  the client can send this for a `POST` too, though it doesn't seem to be common practice.  there is no good reason it isn't though.

## `Content-Length`

if present, and `Transfer-Encoding` is not present, this denotes the size of the message body.  if `Transfer-Encoding` is present (they shouldn't both be), `Content-Length` should be ignored.

## `Content-Type`

it should be present whenever an entity is sent.  if it isn't, `application/octet-stream` may be assumed.  otherwise, remember to specify a decent `charset` for the data if it is `text/*`, e.g.: `Content-Type: text/html; charset=utf-8`.

## `Expect`

only relevant for `POST`.  if the value is not (case-insensitive) `100-continue`, or if it is but the request is not acceptable, send 417 "expectation failed".  note that `100-continue` will usually have to be handled by the programs that handle the `POST` request, which is usually a separate process started by the webserver.

## `Host`

_All_ requests must have a `Host` header (see section 9).  Even if it isn't used, e.g. for `TRACE` requests.  Also, when the path, specified after the method, is a full URL, the `Host` must still be present but must also be ignored.

## `If-Match` and `If-Unmodified-Since`

only mandatory for `PUT` and `DELETE`, to make operations safe.  are not really useful for `GET` etc.

## `Transfer-Encoding`

when present, in practice it has the value `chunked`.  this one is "funny" to read about in rfc2616.  first, according to section 14.41 multiple transformations can be applied to message.  thus, we are allowed to send `Transfer-Encoding: chunked, chunked`, and wrap one chunk-stream in another.  utterly silly and annoying.  xxx check how many clients support this.

on the other hand:  section 4.4, list item 2, says that if the value is anything other than `identity` it means it is simply chunked.  though that section implies something other hilarious again.

***

## `Allow`

send this comma-separated value in response to an `OPTIONS` request.  not much use sending it otherwise, though you are allowed to.

## `Accept-Ranges`

you can send this with value `bytes` if you support range requests (with the `Range` request-header and `Content-Range` response-header).  it isn't required though, clients can always try to send range requests.  it is probably useful to send this for `OPTIONS` requests.

## `ETag`

these are only mandatory for `Range` requests.  they are very useful for caching since they specify the version of a file uniquely.  the older (and seemingly more popular, even in this century) habit of using timestamps with second-precision has only disadvantages.

etags are simply quoted strings that represent the entity uniquely.  the SHA-1 hash of the contents can be used, but this usually isn't feasible.  better:  the SHA-1 hash of the concatenatino of: last modification time (of the file or of the data generated content is based on), requested URL (host, port, path, query), file modification count.

the etag should normally be about the entity returned (e.g. with a 200 "OK" response) or not returned (e.g. with a 304 "not modified" response).  for 201 "created", the etag is about the object created, not the response.  it doesn't make much sense to return etags in error responses, such as 404 "file not found", they would have to be about the error message, which isn't useful.

## `Expires`

used for specifying how long an entity can be cached.  data that should not be cached can send a date string in the past, or equal to the current date minus approximately a year (this comes from the specification indeed..., section 14.21).  but that's mostly for compatibility with http/1.0.  sending a `Cache-Control: max-age=0` is preferred (by me at least).

## `Last-Modified`

the last modification time of the file or data the entity is based on, as a date string.  the value is again used by clients in conditional requests, with the `If-Unmodified-Since` header.  there is no reason not to include it when an mtime is available.

## `Location`

an url pointing to an object.  should be present in: 301 "moved permanently", 302 "found", 303 "see other", 307 "temporary redirect";  may be present in: 300 "multiple choices"

a 305 "use proxy" should have a location header pointing to a proxy.  this response doesn't make much sense though.

in practice, just implement for the 3xx responses mentioned above.

## `Server`

an identification of the server.  is not mandatory, but useful for debugging and statistics.  note that this isn't free-form, use `name/version`, e.g. `myhttpd/1`.

## `Vary`

used for specifying (to a cache) which headers were used in content negotiation.  if the value is `*`, other elements than headers have influenced the representation chosen.  otherwise, it is a comma-separated list of header fields.  a cache may return a previously returned response if the headers listed are identical and the other caching headers are valid.

## `WWW-Authenticate`

must be present in a 401 "unauthorized".  specified in rfc 2617.  "basic" authorization just sends plaintext username/passwords.  "digest" authorization uses a challenge.  not great.

***

## `Date`

the date the client/server created the request/response.  no reason not to include it.

## `Cache-Control`

this header as many pages in the rfc describing its behaviour.  if you want things explicitly uncacheable, make the server return `max-age=0`.  safe to ignore otherwise, mostly relevant for caches.

## `Pragma`

for backwards compatibility.  http/1.0 used this for caching.  when making an object explicitly uncacheable, set it to `no-cache`.  safe to ignore otherwise.

## `Trailer`

comma-separated list of headers that will be present in the trailing headers after the chunk-encoded stream.  there is rarely a reason to need and implement this.  trailing headers must be explicitly allowed.  safe to ignore.


# on http quirks

this section describes some strange things about http/1.1.

servers should ignore empty lines at the beginning of a request.  for being lenient towards crappy clients.

quality values in headers, e.g. `q=0.2` are a bit silly.  e.g. these are all valid values: `0.`, `0.0`, `0`, `0.000`.  do they all have the same semantics?  elsewhere in the specification, special meaning is assigned to a value of `0`.  do they mean the floating point value zero?  simply picking numbers from 0-1000 would have been easier.

needing to understand three forms of dates...

full url should be understood by servers, but Host: must always be present.  if a full url is present, the Host header must simply be ignored.

a Host: header should include the port the request came in on.  this is useless, the server can always determine which port it was.  a client can lie about this.  the hostname is different of course, that's what the host header is for.

section 4.4, list item 2 claims that a message has `Transfer-Encoding` with a value other than `identity`, it means the transfer encoding is chunked, "unless the message is terminated by closing the connection".  this implies a response with such a header value will have to be treated as chunked and buffered somewhere, and if the connection ends before the proper end-of-chunked-stream message has come in, the entire chunked stream (with chunk messages) will retroactively have to be interpreted as a literal stream.  hilarious.  sad.

a cache is only allowed to combine range requests if the etag is strongly equivalent.  sure.  a client, however, is not granted the same protection, it is allowed (well, not forbidden as with caches) to combine the responses.  it doesn't make sense to specify this restriction just for caches.

the whole idea of using timestamps with second-precision for caching isn't great.  the way the timestamp is specified is even more ridiculous.  the fact that entities can be conditionally retrieved based on the timestamp is even more silly given that etags are so much more useful for that.

an `OPTIONS` request wants to know which methods are allowed on an object.  to determine this, we may need authorization credentials.  otherwise we might be giving away information the client is not allowed to know.  and besides, it sounds pretty bloaty...  so instead, we'll just say we support POST on everything, as if `*` was specified for path.  also, it seems `OPTIONS` is somewhwat underspecified.  e.g., what to do when the path does not exist?  lastly, no one seems to use `OPTIONS`, so we really do not care enough.

# on http/1.0 compatibility

xxx to write
mention headers new to http/1.1, which must be ignored for http/1.0.
mention new status response codes and when they are used.
new methods?  aren't defined right?

http/1.0 headers:

- Allow
- Authorization
- Content-Encoding
- Content-Length
- Content-Type
- Date
- Expires
- From
- If-Modified-Since
- Last-Modified
- Location
- Pragma
- Referer
- Server
- User-Agent
- WWW-Authenticate

new in http/1.1:

- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Accept-Ranges
- Age
- Cache-Control
- Connection
- Content-Language
- Content-Location
- Content-MD5
- Content-Range
- ETag
- Expect
- Host
- If-Match
- If-None-Match
- If-Range
- If-Unmodified-Since
- Max-Forwards
- Proxy-Authenticate
- Proxy-Authorization
- Range
- Retry-After
- TE
- Trailer
- Transfer-Encoding
- Upgrade
- Vary
- Via
- Warning

sending headers such as `ETag` to a http/1.0 client is not a problem, clients should not do anything with them.  some incoming headers should really be handled for http/1.1 only:

- Expect
- If-Match
- If-None-Match
- If-Range
- If-Unmodified-Since
- Range
- Transfer-Encoding

missing length for clients sending a body must result in 400, not 411? (rfcrfc1945#7.2.2)
if-modified-since should be ignored for head request (rfc1945#8.1)

Added doc/implementations.txt.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
benchmarks:
http://www.acme.com/software/http_load/
http://www.hping.org/wbox/

servers:
lighttpd
apache
thttpd
hiawatha
cherokee
bozohttpd
nostromo

clients:
lynx
w3m
links
elinks
firefox
opera
konqueror
wget
openbsd ftp
curl
python http libs
charon
safari
internet explorer

compliance testers:

Added doc/ndb-testshttpd.





























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#  echo reload >/chan/shttpd

debug
vhost
ctlchan=shttpd
#accesslog=/services/logs/shttpdaccess
announce=net!localhost!8000
announce=net!localhost!8001

mime	ext=.sig	type='application/pgp-signature'
mime	ext=.swf	type='application/x-shockwave-flash'
mime	ext=.m3u	type='audio/x-mpegurl'
mime	ext=.xbm	type='image/x-xbitmap'
mime	ext=.xpm	type='image/x-xpixmap'
mime	ext=.asc	type='text/plain; charset=utf-8'
mime	ext=.cpp	type='text/plain; charset=utf-8'
mime	ext=.log	type='text/plain; charset=utf-8'
mime	ext=.text	type='text/plain; charset=utf-8'
mime	ext=.dtd	type='text/xml; charset=utf-8'
mime	ext=.xml	type='text/xml; charset=utf-8'
mime	ext=.mov	type='video/quicktime'
mime	ext=.wmv	type='video/x-ms-wmv'
mime	ext=.erl	type='text/plain; charset=utf-8'

mime	ext=.dis	type='application/x-dis; charset=utf-8'
mime	ext=.jpg	type='testing/jpg'

host=localhost port=8000
	cachesecs=60
	listings	path=''
	listen	ip=127.1
	index	file=index.html file=index.htm file=index.txt
	redir	src='^/redir1$'		dst=http://www.example.com/redir1
	redir	src='^/redir2$'		dst=/redir3
	redir	src='^/redir4$'		dst=/$0/$1
	redir	src='^/redir5$'		dst=/$$$$
	cgi	path=/cgi0	cmd='{load std; echo Status: 200 OK; echo content-type: text/plain; echo; cd /env && for(i in *) { echo -n $i^''=''; cat $i; echo}}'
	cgi	path=/cgi1	cmd='{echo test}'
	cgi	path=/cgi2	cmd='{echo Status: 100 continue}'
	cgi	path=/cgi3	cmd='{echo Status: 100 continue; echo; echo Status: 200 OK; echo content-type: text/plain; echo; echo test}'
	cgi	path=/cgi4	cmd='{echo Status: 200 OK; echo content-length: test; echo;}'
	cgi	path=/cgi5	cmd='{echo Status: 200 OK; echo content-length: 1; echo content-type: text/plain; echo; echo -n a}'
	cgi	path=/cgi6	cmd='{echo Status: 200 OK; echo content-length: 1; echo content-type: text/plain; echo; echo -n aa}'
	cgi	path=/cgi7	cmd='{echo Status: 200 OK; echo content-length: 1; echo content-type: text/plain; echo}'
	cgi	path=/cgi8	cmd='{load std; echo Status: 200 OK; echo content-type: text/plain; echo; cd /env && for(i in *) { echo -n $i^''=''; cat $i; echo}}'	methods=GET,HEAD
	scgi	path=/scgi0	addr='net!localhost!4006'
	scgi	path=/scgi1	addr='net!localhost!3999'
	auth	path=/auth0	realm=test user=testuser pass=testpass

alias
	host='localhost.local' port=8000 usehost=localhost

alias
	host='127.0.0.2' port=8000 usehost=localhost
alias
	host='::1' port=8000 usehost=localhost

host='*' port=8000
	index	file=index.html file=index.htm file=index.txt
	listings	path=''

Added doc/requests.txt.









































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
requests made by commonly used clients

python2.5 libs:
GET /test 123 HTTP/1.1
Host: localhost:8000
Accept-Encoding: identity

wget:
GET /test%20123 HTTP/1.0
User-Agent: Wget/1.10.2
Accept: */*
Host: localhost:8000
Connection: Keep-Alive

openbsd ftp:
GET /test 123 HTTP/1.0
Host: localhost:8000
User-Agent: OpenBSD ftp

firefox 2.0.0.6:
GET /test%20123 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.6) Gecko/20070819 Firefox/2.0.0.6
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

curl:
GET /test 123 HTTP/1.1
User-Agent: curl/7.16.2 (i386-unknown-openbsd4.2) libcurl/7.16.2 OpenSSL/0.9.7j zlib/1.2.3 libidn/0.6.1
Host: localhost:8000
Accept: */*

lynx:
GET /test%20123 HTTP/1.0
Host: localhost:8000
Accept: text/html, text/plain, text/sgml, video/mpeg, image/jpeg, image/tiff, image/x-rgb, image/png, image/x-xbitmap, image/x-xbm, image/gif, application/postscript, */*;q=0.01
Accept-Encoding: gzip, compress
Accept-Language: en
User-Agent: Lynx/2.8.5rel.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7j

w3m:
GET /test%20123 HTTP/1.0
User-Agent: w3m/0.5.2
Accept: text/html, text/*;q=0.5, image/*
Accept-Encoding: gzip, compress, bzip, bzip2, deflate
Accept-Language: en;q=1.0
Host: localhost:8000

charon:
GET /test lala HTTP/1.0
Accept: */*; *
Host: localhost:8000
User-Agent: Mozilla/4.08 (Charon; Inferno)

links:
GET /test%20123 HTTP/1.1
Host: localhost:8000
User-Agent: Links (1.00pre20; OpenBSD 4.2 i386; 80x24)
Accept: */*
Accept-Charset: us-ascii, ISO-8859-1, ISO-8859-2, ISO-8859-4, ISO-8895-5, ISO-8859-7, ISO-8895-9, ISO-8859-13, ISO-8859-15, ISO-8859-16, windows-1250, windows-1251, windows-1257, cp437, cp737, cp850, cp852, cp866, x-cp866-u, x-mac, x-mac-ce, x-kam-cs, koi8-r, koi8-u, TCVN-5712, VISCII, utf-8
Accept-Language: en, *;q=0.1
Connection: Keep-Alive

elinks:
GET /test%20123 HTTP/1.1
Host: localhost:8000
User-Agent: ELinks/0.11.2 (textmode; OpenBSD 4.2 i386; 80x24-2)
Accept: */*
Accept-Encoding: gzip
Accept-Language: en
Connection: Keep-Alive

konqueror:
GET /test%20123 HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; OpenBSD) KHTML/3.5.7 (like Gecko)
Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate
Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
Accept-Language: en
Host: localhost:8000
Connection: Keep-Alive

internet explorer 6:
GET /test%20123 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: localhost:8000
Connection: Keep-Alive

safari 3 beta for windows:
GET /test%20123 HTTP/1.1
Accept-Encoding: gzip, deflate
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Connection: keep-alive
Host: localhost:8000

Added doc/rfc1630.txt.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                     T. Berners-Lee
Request for Comments: 1630                                          CERN
Category: Informational                                        June 1994


                 Universal Resource Identifiers in WWW

                A Unifying Syntax for the Expression of
             Names and Addresses of Objects on the Network
                     as used in the World-Wide Web

Status of this Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

IESG Note:

   Note that the work contained in this memo does not describe an
   Internet standard.  An Internet standard for general Resource
   Identifiers is under development within the IETF.

Introduction

   This document defines the syntax used by the World-Wide Web
   initiative to encode the names and addresses of objects on the
   Internet.  The web is considered to include objects accessed using an
   extendable number of protocols, existing, invented for the web
   itself, or to be invented in the future.  Access instructions for an
   individual object under a given protocol are encoded into forms of
   address string.  Other protocols allow the use of object names of
   various forms.  In order to abstract the idea of a generic object,
   the web needs the concepts of the universal set of objects, and of
   the universal set of names or addresses of objects.

   A Universal Resource Identifier (URI) is a member of this universal
   set of names in registered name spaces and addresses referring to
   registered protocols or name spaces.  A Uniform Resource Locator
   (URL), defined elsewhere, is a form of URI which expresses an address
   which maps onto an access algorithm using network protocols. Existing
   URI schemes which correspond to the (still mutating) concept of IETF
   URLs are listed here. The Uniform Resource Name (URN) debate attempts
   to define a name space (and presumably resolution protocols) for
   persistent object names. This area is not addressed by this document,
   which is written in order to document existing practice and provide a
   reference point for URL and URN discussions.




Berners-Lee                                                     [Page 1]

RFC 1630                      URIs in WWW                      June 1994


   The world-wide web protocols are discussed on the mailing list www-
   talk-request@info.cern.ch and the newsgroup comp.infosystems.www is
   preferable for beginner's questions. The mailing list uri-
   request@bunyip.com has discussion related particularly to the URI
   issue.  The author may be contacted as timbl@info.cern.ch.

   This document is available in hypertext form at:

   http://info.cern.ch/hypertext/WWW/Addressing/URL/URI_Overview.html

The Need For a Universal Syntax

   This section describes the concept of the URI and does not form part
   of the specification.

   Many protocols and systems for document search and retrieval are
   currently in use, and many more protocols or refinements of existing
   protocols are to be expected in a field whose expansion is explosive.

   These systems are aiming to achieve global search and readership of
   documents across differing computing platforms, and despite a
   plethora of protocols and data formats.  As protocols evolve,
   gateways can allow global access to remain possible. As data formats
   evolve, format conversion programs can preserve global access.  There
   is one area, however, in which it is impractical to make conversions,
   and that is in the names and addresses used to identify objects.
   This is because names and addresses of objects are passed on in so
   many ways, from the backs of envelopes to hypertext objects, and may
   have a long life.

   A common feature of almost all the data models of past and proposed
   systems is something which can be mapped onto a concept of "object"
   and some kind of name, address, or identifier for that object.  One
   can therefore define a set of name spaces in which these objects can
   be said to exist.

   Practical systems need to access and mix objects which are part of
   different existing and proposed systems.  Therefore, the concept of
   the universal set of all objects, and hence the universal set of
   names and addresses, in all name spaces, becomes important.  This
   allows names in different spaces to be treated in a common way, even
   though names in different spaces have differing characteristics, as
   do the objects to which they refer.








Berners-Lee                                                     [Page 2]

RFC 1630                      URIs in WWW                      June 1994


   URIs

      This document defines a way to encapsulate a name in any
      registered name space, and label it with the the name space,
      producing a member of the universal set.  Such an encoded and
      labelled member of this set is known as a Universal Resource
      Identifier, or URI.

      The universal syntax allows access of objects available using
      existing protocols, and may be extended with technology.

      The specification of the URI syntax does not imply anything about
      the properties of names and addresses in the various name spaces
      which are mapped onto the set of URI strings.  The properties
      follow from the specifications of the protocols and the associated
      usage conventions for each scheme.

   URLs

      For existing Internet access protocols, it is necessary in most
      cases to define the encoding of the access algorithm into
      something concise enough to be termed address.  URIs which refer
      to objects accessed with existing protocols are known as "Uniform
      Resource Locators" (URLs) and are listed here as used in WWW, but
      to be formally defined in a separate document.

   URNs

      There is currently a drive to define a space of more persistent
      names than any URLs.  These "Uniform Resource Names" are the
      subject of an IETF working group's discussions.  (See Sollins and
      Masinter, Functional Specifications for URNs, circulated
      informally.)

      The URI syntax and URL forms have been in widespread use by
      World-Wide Web software since 1990.















Berners-Lee                                                     [Page 3]

RFC 1630                      URIs in WWW                      June 1994


Design Criteria and Choices

   This section is not part of the specification: it is simply an
   explanation of the way in which the specification was derived.

   Design criteria

      The syntax was designed to be:

      Extensible              New naming schemes may be added later.

      Complete                It is possible to encode any naming
                              scheme.

      Printable               It is possible to express any URI using
                              7-bit ASCII characters so that URIs may,
                              if necessary, be passed using pen and ink.

   Choices for a universal syntax

      For the syntax itself there is little choice except for the order
      and punctuation of the elements, and the acceptable characters and
      escaping rules.

      The extensibility requirement is met by allowing an arbitrary (but
      registered) string to be used as a prefix.  A prefix is chosen as
      left to right parsing is more common than right to left.  The
      choice of a colon as separator of the prefix from the rest of the
      URI was arbitrary.

      The decoding of the rest of the string is defined as a function of
      the prefix.  New prefixed are introduced for new schemes as
      necessary, in agreement with the registration authority.  The
      registration of a new scheme clearly requires the definition of
      the decoding of the URI into a given name space, and a definition
      of the properties and, where applicable, resolution protocols, for
      the name space.

      The completeness requirement is easily met by allowing
      particularly strange or plain binary names to be encoded in base
      16 or 64 using the acceptable characters.

      The printability requirement could have been met by requiring all
      schemes to encode characters not part of a basic set.  This led to
      many discussions of what the basic set should be.  A difficult
      case, for example, is when an ISO latin 1 string appears in a URL,
      and within an application with ISO Latin-1 capability, it can be
      handled intact.  However, for transport in general, the non-ASCII



Berners-Lee                                                     [Page 4]

RFC 1630                      URIs in WWW                      June 1994


      characters need to be escaped.

      The solution to this was to specify a safe set of characters, and
      a general escaping scheme which may be used for encoding "unsafe"
      characters.  This "safe" set is suitable, for example, for use in
      electronic mail.  This is the canonical form of a URI.

      The choice of escape character for introducing representations of
      non-allowed characters also tends to be a matter of taste.  An
      ANSI standard exists in the C language, using the back-slash
      character "\".  The use of this character on unix command lines,
      however, can be a problem as it is interpreted by many shell
      programs, and would have itself to be escaped.  It is also a
      character which is not available on certain keyboards.  The equals
      sign is commonly used in the encoding of names having
      attribute=value pairs.  The percent sign was eventually chosen as
      a suitable escape character.

      There is a conflict between the need to be able to represent many
      characters including spaces within a URI directly, and the need to
      be able to use a URI in environments which have limited character
      sets or in which certain characters are prone to corruption.  This
      conflict has been resolved by use of an hexadecimal escaping
      method which may be applied to any characters forbidden in a given
      context.  When URLs are moved between contexts, the set of
      characters escaped may be enlarged or reduced unambiguously.

      The use of white space characters is risky in URIs to be printed
      or sent by electronic mail, and the use of multiple white space
      characters is very risky.  This is because of the frequent
      introduction of extraneous white space when lines are wrapped by
      systems such as mail, or sheer necessity of narrow column width,
      and because of the inter-conversion of various forms of white
      space which occurs during character code conversion and the
      transfer of text between applications.  This is why the canonical
      form for URIs has all white spaces encoded.

Reommendations

   This section describes the syntax for URIs as used in the WorldWide
   Web initiative.  The generic syntax provides a framework for new
   schemes for names to be resolved using as yet undefined protocols.

URI syntax

   A complete URI consists of a naming scheme specifier followed by a
   string whose format is a function of the naming scheme.  For locators
   of information on the Internet, a common syntax is used for the IP



Berners-Lee                                                     [Page 5]

RFC 1630                      URIs in WWW                      June 1994


   address part. A BNF description of the URL syntax is given in an a
   later section. The components are as follows.  Fragment identifiers
   and relative URIs are not involved in the basic URL definition.

   SCHEME

      Within the URI of a object, the first element is the name of the
      scheme, separated from the rest of the object by a colon.

   PATH

      The rest of the URI follows the colon in a format depending on the
      scheme. The path is interpreted in a manner dependent on the
      protocol being used.  However, when it contains slashes, these
      must imply a hierarchical structure.

Reserved characters

   The path in the URI has a significance defined by the particular
   scheme.  Typically, it is used to encode a name in a given name
   space, or an algorithm for accessing an object.  In either case, the
   encoding may use those characters allowed by the BNF syntax, or
   hexadecimal encoding of other characters.

   Some of the reserved characters have special uses as defined here.

   THE PERCENT SIGN

      The percent sign ("%", ASCII 25 hex) is used as the escape
      character in the encoding scheme and is never allowed for anything
      else.

   HIERARCHICAL FORMS

      The slash ("/", ASCII 2F hex) character is reserved for the
      delimiting of substrings whose relationship is hierarchical.  This
      enables partial forms of the URI.  Substrings consisting of single
      or double dots ("." or "..") are similarly reserved.

      The significance of the slash between two segments is that the
      segment of the path to the left is more significant than the
      segment of the path to the right.  ("Significance" in this case
      refers solely to closeness to the root of the hierarchical
      structure and makes no value judgement!)







Berners-Lee                                                     [Page 6]

RFC 1630                      URIs in WWW                      June 1994


      Note

         The similarity to unix and other disk operating system filename
         conventions should be taken as purely coincidental, and should
         not be taken to indicate that URIs should be interpreted as
         file names.

   HASH FOR FRAGMENT IDENTIFIERS

      The hash ("#", ASCII 23 hex) character is reserved as a delimiter
      to separate the URI of an object from a fragment identifier .

   QUERY STRINGS

      The question mark ("?", ASCII 3F hex) is used to delimit the
      boundary between the URI of a queryable object, and a set of words
      used to express a query on that object.  When this form is used,
      the combined URI stands for the object which results from the
      query being applied to the original object.

      Within the query string, the plus sign is reserved as shorthand
      notation for a space.  Therefore, real plus signs must be encoded.
      This method was used to make query URIs easier to pass in systems
      which did not allow spaces.

      The query string represents some operation applied to the object,
      but this specification gives no common syntax or semantics for it.
      In practice the syntax and sematics may depend on the scheme and
      may even on the base URI.

   OTHER RESERVED CHARACTERS

      The astersik ("*", ASCII 2A hex) and exclamation mark ("!" , ASCII
      21 hex) are reserved for use as having special signifiance within
      specific schemes.

Unsafe characters

   In canonical form, certain characters such as spaces, control
   characters, some characters whose ASCII code is used differently in
   different national character variant 7 bit sets, and all 8bit
   characters beyond DEL (7F hex) of the ISO Latin-1 set, shall not be
   used unencoded. This is a recommendation for trouble-free
   interchange, and as indicated below, the encoded set may be extended
   or reduced.






Berners-Lee                                                     [Page 7]

RFC 1630                      URIs in WWW                      June 1994


Encoding reserved characters

   When a system uses a local addressing scheme, it is useful to provide
   a mapping from local addresses into URIs so that references to
   objects within the addressing scheme may be referred to globally, and
   possibly accessed through gateway servers.

   For a new naming scheme, any mapping scheme may be defined provided
   it is unambiguous, reversible, and provides valid URIs.  It is
   recommended that where hierarchical aspects to the local naming
   scheme exist, they be mapped onto the hierarchical URL path syntax in
   order to allow the partial form to be used.

   It is also recommended that the conventional scheme below be used in
   all cases except for any scheme which encodes binary data as opposed
   to text, in which case a more compact encoding such as pure
   hexadecimal or base 64 might be more appropriate.  For example, the
   conventional URI encoding method is used for mapping WAIS, FTP,
   Prospero and Gopher addresses in the URI specification.

   CONVENTIONAL URI ENCODING SCHEME

      Where the local naming scheme uses ASCII characters which are not
      allowed in the URI, these may be represented in the URL by a
      percent sign "%" immediately followed by two hexadecimal digits
      (0-9, A-F) giving the ISO Latin 1 code for that character.
      Character codes other than those allowed by the syntax shall not
      be used unencoded in a URI.

   REDUCED OR INCREASED SAFE CHARACTER SETS

      The same encoding method may be used for encoding characters whose
      use, although technically allowed in a URI, would be unwise due to
      problems of corruption by imperfect gateways or misrepresentation
      due to the use of variant character sets, or which would simply be
      awkward in a given environment.  Because a % sign always indicates
      an encoded character, a URI may be made "safer" simply by encoding
      any characters considered unsafe, while leaving already encoded
      characters still encoded.  Similarly, in cases where a larger set
      of characters is acceptable, % signs can be selectively and
      reversibly expanded.

      Before two URIs can be compared, it is therefore necessary to
      bring them to the same encoding level.

      However, the reserved characters mentioned above have a quite
      different significance when encoded, and so may NEVER be encoded
      and unencoded in this way.



Berners-Lee                                                     [Page 8]

RFC 1630                      URIs in WWW                      June 1994


      The percent sign intended as such must always be encoded, as its
      presence otherwise always indicates an encoding.  Sequences which
      start with a percent sign but are not followed by two hexadecimal
      characters are reserved for future extension.  (See Example 3.)

   Example 1

   The URIs

                http://info.cern.ch/albert/bertram/marie-claude

   and

                http://info.cern.ch/albert/bertram/marie%2Dclaude

   are identical, as the %2D encodes a hyphen character.

   Example 2

   The URIs

                http://info.cern.ch/albert/bertram/marie-claude

   and

                http://info.cern.ch/albert/bertram%2Fmarie-claude

   are NOT identical, as in the second case the encoded slash does not
   have hierarchical significance.

   Example 3

   The URIs

                fxqn:/us/va/reston/cnri/ietf/24/asdf%*.fred

   and

                news:12345667123%asdghfh@info.cern.ch

   are illegal, as all % characters imply encodings, and there is no
   decoding defined for "%*"  or "%as" in this recommendation.

Partial (relative) form

   Within a object whose URI is well defined, the URI of another object
   may be given in abbreviated form, where parts of the two URIs are the
   same. This allows objects within a group to refer to each other



Berners-Lee                                                     [Page 9]

RFC 1630                      URIs in WWW                      June 1994


   without requiring the space for a complete reference, and it
   incidentally allows the group of objects to be moved without changing
   any references.  It must be emphasized that when a reference is
   passed in anything other than a well controlled context, the full
   form must always be used.

   In the World-Wide Web applications, the context URI is that of the
   document or object containing a reference. In this case partial URIs
   can be generated in virtual objects or stored in real objects,
   without the need for dramatic change if the higher-order parts of a
   hierarchical naming system are modified.  Apart from terseness, this
   gives greater robustness to practical systems, by enabling
   information hiding between system components.

   The partial form relies on a property of the URI syntax that certain
   characters ("/") and certain path elements ("..", ".") have a
   significance reserved for representing a hierarchical space, and must
   be recognized as such by both clients and servers.

   A partial form can be distinguished from an absolute form in that the
   latter must have a colon and that colon must occur before any slash
   characters. Systems not requiring partial forms should not use any
   unencoded slashes in their naming schemes.  If they do, absolute URIs
   will still work, but confusion may result. (See note on Gopher
   below.)

   The rules for the use of a partial name relative to the URI of the
   context are:

      If the scheme parts are different, the whole absolute URI must
      be given.  Otherwise, the scheme is omitted, and:

      If the partial URI starts with a non-zero number of consecutive
      slashes, then everything from the context URI up to (but not
      including) the first occurrence of exactly the same number of
      consecutive slashes which has no greater number of consecutive
      slashes anywhere to the right of it is taken to be the same and
      so prepended to the partial URL to form the full URL. Otherwise:

      The last part of the path of the context URI (anything following
      the rightmost slash) is removed, and the given partial URI
      appended in its place, and then:

      Within the result, all occurrences of "xxx/../" or "/." are
      recursively removed, where xxx, ".." and "." are complete path
      elements.





Berners-Lee                                                    [Page 10]

RFC 1630                      URIs in WWW                      June 1994


      Note: Trailing slashes

   If a path of the context locator ends in slash, partial URIs are
   treated differently to the URI with the same path but without a
   trailing slash. The trailing slash indicates a void segment of the
   path.

      Note: Gopher

   The gopher system does not have the concept of relative URIs, and the
   gopher community currently allows / as data characters in gopher URIs
   without escaping them to %2F.  Relative forms may not in general be
   used for documents served by gopher servers.  If they are used, then
   WWW software assumes, normally correctly, that in fact they do have
   hierarchical significance despite the specifications. The use of HTTP
   rather than gopher protocol is however recommended.

   Examples

   In the context of URI

                        magic://a/b/c//d/e/f

   the partial URIs would expand as follows:

   g                       magic://a/b/c//d/e/g

   /g                      magic://a/g

   //g                     magic://g

   ../g                    magic://a/b/c//d/g

   g:h                     g:h

   and in the context of the URI

                           magic://a/b/c//d/e/

   the results would be exactly the same.

Fragment-id

   This represents a part of, fragment of, or a sub-function within, an
   object.  Its syntax and semantics are defined by the application
   responsible for the object, or the specification of the content type
   of the object.  The only definition here is of the allowed characters
   by which it may be represented in a URL.



Berners-Lee                                                    [Page 11]

RFC 1630                      URIs in WWW                      June 1994


   Specific syntaxes for representing fragments in text documents by
   line and character range, or in graphics by coordinates, or in
   structured documents using ladders, are suitable for standardization
   but not defined here.

   The fragment-id follows the URL of the whole object from which it is
   separated by a hash sign (#).  If the fragment-id is void, the hash
   sign may be omitted: A void fragment-id with or without the hash sign
   means that the URL refers to the whole object.

   While this hook is allowed for identification of fragments, the
   question of addressing of parts of objects, or of the grouping of
   objects and relationship between continued and containing objects, is
   not addressed by this document.

   Fragment identifiers do NOT address the question of objects which are
   different versions of a "living" object, nor of expressing the
   relationships between different versions and the living object.

   There is no implication that a fragment identifier refers to anything
   which can be extracted as an object in its own right.  It may, for
   example, refer to an indivisible point within an object.

Specific Schemes

   The mapping for URIs onto some existing standard and experimental
   protocols is outlined in the BNF syntax definition.  Notes on
   particular protocols follow.  These URIs are frequently referred to
   as URLs, though the exact definition of the term URL is still under
   discussion (March 1993).  The schemes covered are:

   http                    Hypertext Transfer Protocol (examples)

   ftp                     File Transfer protocol

   gopher                  Gopher protocol

   mailto                  Electronic mail address

   news                    Usenet news

   telnet, rlogin and tn3270
                           Reference to interactive sessions

   wais                    Wide Area Information Servers

   file                    Local file access




Berners-Lee                                                    [Page 12]

RFC 1630                      URIs in WWW                      June 1994


   The following schemes are proposed as essential to the unification of
   the web with electronic mail, but not currently (to the author's
   knowledge) implemented:

   mid                     Message identifiers for electronic mail

   cid                     Content identifiers for MIME body part

   The schemes for X.500, network management database, and Whois++ have
   not been specified and may be the subject of further study.  Schemes
   for Prospero, and restricted NNTP use are not currently implemented
   as far as the author is aware.

   The "urn" prefix is reserved for use in encoding a Uniform Resource
   Name when that has been developed by the IETF working group.

   New schemes may be registered at a later time.

HTTP

   The HTTP protocol specifies that the path is handled transparently by
   those who handle URLs, except for the servers which de-reference
   them.  The path is passed by the client to the server with any
   request, but is not otherwise understood by the client.

   The host details are not passed on to the client when the URL is an
   HTTP URL which refers to the server in question.  In this case the
   string sent starts with the slash which follows the host details.
   However, when an HTTP server is being used as a gateway (or "proxy")
   then the entire URI, whether HTTP or some other scheme, is passed on
   the HTTP command line.  The search part, if present, is sent as part
   of the HTTP command, and may in this respect be treated as part of
   the path.  No fragmentid part of a WWW URI (the hash sign and
   following) is sent with the request.  Spaces and control characters
   in URLs must be escaped for transmission in HTTP, as must other
   disallowed characters.

   EXAMPLES

      These examples are not part of the specification: they are
      provided as illustations only.  The URI of the "welcome" page to a
      server is conventionally

         http://www.my.work.com/

         As the rest of the URL (after the hostname an port) is opaque
         to the client, it shows great variety but the following are all
         fairly typical.



Berners-Lee                                                    [Page 13]

RFC 1630                      URIs in WWW                      June 1994


http://www.my.uni.edu/info/matriculation/enroling.html

http://info.my.org/AboutUs/Phonebook

http://www.library.my.town.va.us/Catalogue/76523471236%2Fwen44--4.98

http://www.my.org/462F4F2D4241522A314159265358979323846

   A URL for a server on a different port to 80 looks like

        http://info.cern.ch:8000/imaginary/test

   A reference to a particular part of a document may, including the
   fragment identifier, look like

        http://www.myu.edu/org/admin/people#andy

   in which case the string "#andy" is not sent to the server, but is
   retained by the client and used when the whole object had been
   retrieved.

    A search on a text database might look like

        http://info.my.org/AboutUs/Index/Phonebook?dobbins

   and on another database

        http://info.cern.ch/RDB/EMP?*%20where%20name%%3Ddobbins

   In all cases the client passes the path string to the server
   uninterpreted, and for the client to deduce anything from

FTP

   The ftp: prefix indicates that the FTP protocol is used, as defined
   in STD 9, RFC 959 or any successor.  The port number, if present,
   gives the port of the FTP server if not the FTP default.

   User name and password

      The syntax allows for the inclusion of a user name and even a
      password for those systems which do not use the anonymous FTP
      convention. The default, however, if no user or password is
      supplied, will be to use that convention, viz. that the user name
      is "anonymous" and the password the user's Internet-style mail
      address.





Berners-Lee                                                    [Page 14]

RFC 1630                      URIs in WWW                      June 1994


      Where possible, this mail address should correspond to a usable
      mail address for the user, and preferably give a DNS host name
      which resolves to the IP address of the client.  Note that servers
      currently vary in their treatment of the anonymous password.

   Path

      The FTP protocol allows for a sequence of CWD commands (change
      working directory) and a TYPE command prior to service commands
      such as RETR (retrieve) or NLIST (etc.) which actually access a
      file.

      The arguments of any CWD commands are successive segment parts of
      the URL delimited by slash, and the final segment is suitable as
      the filename argument to the RETR command for retrieval or the
      directory argument to NLIST.

      For some file systems (Unix in particular), the "/" used to denote
      the hierarchical structure of the URL corresponds to the delimiter
      used to construct a file name hierarchy, and thus, the filename
      will look the same as the URL path.  This does NOT mean that the
      URL is a Unix filename.

         Note: Retrieving subsequent URLs from the same host

      There is no common hierarchical model to the FTP protocol, so if a
      directory change command has been given, it is impossible in
      general to deduce what sequence should be given to navigate to
      another directory for a second retrieval, if the paths are
      different.  The only reliable algorithm is to disconnect and
      reestablish the control connection.

   Data type

      The data content type of a file can only, in the general FTP case,
      be deduced from the name, normally the suffix of the name.  This
      is not standardized. An alternative is for it to be transferred in
      information outside the URL.  A suitable FTP transfer type (for
      example binary "I" or text "A") must in turn be deduced from the
      data content type.  It is recommended that conventions for
      suffixes of public archives be established, but it is outside the
      scope of this standard.

      An FTP URL may optionally specify the FTP data transfer type by
      which an object is to be retrieved. Most of the methods correspond
      to the FTP "Data Types" ASCII and IMAGE for the retrieval of a
      document, as specified in FTP by the TYPE command.  One method
      indicates directory access.



Berners-Lee                                                    [Page 15]

RFC 1630                      URIs in WWW                      June 1994


      The data type is specified by a suffix to the URL.  Possible
      suffixes are:

       ;type = <type-code>     Use FTP type as given to perform data
                               transfer.

       /                       Use FTP directory list commands to read
                               directory

      The type code is in the format defined in RFC 959 except that THE
      SPACE IS OMITTED FROM THE URL.

   Transfer Mode

      Stream Mode is always used.

Gopher

   The gopher URL specifies the host and optionally the port to which
   the client should connect. This is followed by a slash and a single
   gopher type code. This type code is used by the client to determine
   how to interpret the server's reply and is is not for sending to
   server.  The command string to be sent to the server immediately
   follows the gopher type character.  It consists of the gopher
   selector string followed by any "Gopher plus" syntax, but always
   omitting the trainling CR LF pair.

   When the gopher command string contains characters (such a embedded
   CR LF and HT characters) not allowed in a URL, these are encoded
   using the conventional encoding.

   Note that some gopher selector strings begin with a copy of the
   gopher type character, in which case that character will occur twice
   consecutively.  Also note that the gopher selector string may be an
   empty string since this is how gopher clients refer to the top-level
   directory on a gopher server.

   If the encoded command string (with trailing CR LF stripped) would be
   void then the gopher type character may be omiited and "1" (ASCII 31
   hex) is assumed.

   Note that slash "/" in gopher selector strings may not correspond to
   a level in a hierarchical structure.








Berners-Lee                                                    [Page 16]

RFC 1630                      URIs in WWW                      June 1994


Mailto

   This allows a URL to specify an RFC822 addr-spec mail address.  Note
   that use of % , for example as used in forming a gatewayed mail
   address, requires conversion to %25 in a URL.

News

   The news locators refer to either news group names or article message
   identifiers which must conform to the rules for a Message-Id of RFC
   1036 (Horton 1987).  A message identifier may be distinguished from a
   news group name by the presence of the commercial at "@" character.
   These rules imply that within an article, a reference to a news group
   or to another article will be a valid URL (in the partial form).

   A news URL may be dereferenced using NNTP (RFC 977, Kantor 1986)
   (The ARTICLE by message-id command ) or using any other protocol for
   the conveyance of usenet news articles, or by reference to a body of
   news articles already received.

   Note 1:

      Among URLs the "news" URLs are anomalous in that they are
      location-independent. They are unsuitable as URN candidates
      because the NNTP architecture relies on the expiry of articles and
      therefore a small number of articles being available at any time.
      When a news: URL is quoted, the assumption is that the reader will
      fetch the article or group from his or her local news host.  News
      host names are NOT part of news URLs.

   Note 2:

      An outstanding problem is that the message identifier is
      insufficient to allow the retrieval of an expired article, as no
      algorithm exists for deriving an archive site and file name.  The
      addition of the date and news group set to the article's URL would
      allow this if a directory existed of archive sites by news group.

      Suggested subject of study in conjunction with NNTP working group.
      Further extension possible may be to allow the naming of subject
      threads as addressable objects.

Telnet, rlogin, tn3270

   The use of URLs to represent interactive sessions is a convenient
   extension to their uses for objects.  This allows access to
   information systems which only provide an interactive service, and no
   information server.  As information within the service cannot be



Berners-Lee                                                    [Page 17]

RFC 1630                      URIs in WWW                      June 1994


   addressed individually or, in general, automatically retrieved, this
   is a less desirable, though currently common, solution.

URN

   The "Universal Resource Name" is currently (March 1993) under
   development in the IETF.  A requirements specification is in
   preparation. It currently looks as though it will be a short string
   suitable for encoding in URI syntax, for which case the "urn:" prefix
   is reserved.  The URN shall be encoded precisely as defined in the
   (future) URN standard, except in that:

      If the official description of the URN syntax includes any
      constant wrapper characters, then they shall not be omitted from
      the URI encoding of the URN;

      If the URN has a hierarchical nature, then the slash delimiter
      shall be used in the URI encoding;

      If the URN has a hierarchical nature, the most significant part
      shall be encoded on the left in the URI encoding;

      Any characters with reserved meanings in the URI syntax shall be
      escape encoded

   These rules of course apply to any URI scheme.  It is of course
   possible that the URN syntax will be chosen such that the URI
   encoding will be a 1-1 transcription.

   An example might be a name such as

         urn:/iana/dns/ch/cern/cn/techdoc/94/1642-3

   but the reader should refer to the latest URN drafts or
   specifications.

WAIS

   The current WAIS implementation public domain requires that a client
   know the "type" of a object prior to retrieval. This value is
   returned along with the internal object identifier in the search
   response. It has been encoded into the path part of the URL in order
   to make the URL sufficient for the retrieval of the object.

   Within the WAIS world, names do not of course need to be prefixed by
   "wais:" (by the partial form rules).





Berners-Lee                                                    [Page 18]

RFC 1630                      URIs in WWW                      June 1994


   The wpath of a WAIS URL consists of encoded fields of the WAIS
   identifier, in the same order as inthe WAIS identifier. For each
   field, the identifier field number is the digits before the equals
   sign, and the field contents follow, encoded in the conventional
   encoding, terminated by ";".

file

   The other URI schemes (except nntp) share the property that they are
   equally valid at any geographical place.

   There is however a real practical requirement to be able to generate
   a URL for an object in a machine's local file system.

   The syntax is similar to the ftp syntax, but in this case the slash
   is used to donate boundaries between directory levels of a
   hierarchical file system is used.  The "client" software converts the
   file URL into a file name in the local file name conventions.  This
   allows local files to be treated just as network objects without any
   necessity to use a network server for access.  This may be used for
   example for defining a user's "home" document in WWW.

   There is clearly a danger of confusion that a link made to a local
   file should be followed by someone on a different system, with
   unexpected and possibly harmful results.  Therefore, the convention
   is that even a "file" URL is provided with a host part.  This allows
   a client on another system to know that it cannot access the file
   system, or perhaps to use some other local mecahnism to access the
   file.

   The special value "localhost" is used in the host field to indicate
   that the filename should really be used on whatever host one is.
   This for example allows links to be made to files which are
   distribted on many machines, or to "your unix local password file"
   subject of course to consistency across the users of the data.

   A void host field is equivalent to "localhost".

Message-Id

   For systems which include information transferred using mail
   protocols, there is a need to be able to make cross-references
   between different items of information, even though, by the nature of
   mail, those items are only available to a restricted set of people.

   Two schemes are defined.  The first, "mid:", refers to the STD 11,
   RFC 822 Message-Id of a mail message.  This Identifier is already
   used in RFC 822 in for example the References and In-Reply-to field.



Berners-Lee                                                    [Page 19]

RFC 1630                      URIs in WWW                      June 1994


   The rest of the URL after the "mid:" is the RFC822 msg-id with the
   constant <> wrapper removed, leaving an identifier whose format in
   fact happens to be the same as addr-spec format for mailboxes (though
   the semantics are different).

   The use of a "mid" URL implies access to a body of mail already
   received. If a message has been distributed using NNTP or other
   usenet protocols over the news system, then the "news:" form should
   be used.

Content-Id

   The second scheme, "cid:", is similar to "mid:", but makes reference
   to a body part of a MIME message by the value of its content-id
   field.  This allows, for example, a master document being the first
   part of a multipart/related MIME message to refer to component parts
   which are transferred in the same message.

   Note

      Beware however, that content identifiers are only required to be
      unique within the context of a given MIME message, and so the cid:
      URL is only meaningful with the context the same MIME message. For
      a reference outside the message, it would need to be appended to
      the message-id of the whole message.  A syntax for this has not
      been defined.

Schemes for Further Study

   X500

      The mapping of x500 names onto URLs is not defined here.  A
      decision is required as to whether "distinguished names" or "user
      friendly names" (ufn), or both, should be allowed.  If any
      punctuation conversions are needed from the adopted x500
      representation (such as the use of slashes between parts of a ufn)
      they must be defined.  This is a subject for study.

   WHOIS

      This prefix describes the access using the "whois++" scheme in the
      process of definition.  The host name part is the same as for
      other IP based schemes.  The path part can be either a whois
      handle for a whois object, or it can be a valid whois query
      string. This is a subject for further study.






Berners-Lee                                                    [Page 20]

RFC 1630                      URIs in WWW                      June 1994


   NETWORK MANAGEMENT DATABASE

      This is a subject for study.

   NNTP

      This is an alternative form of reference for news articles,
      specifically to be used with NNTP servers, and particularly those
      incomplete server implementations which do not allow retrieval by
      message identifier.  In all other cases the "news" scheme should
      be used.

      The news server name, newsgroup name, and index number of an
      article within the newsgroup on that particular server are given.
      The NNTP protocol must be used.

      Note 1.

         This form of URL is not of global accessability, as typically
         NNTP servers only allow access from local clients.   Note that
         the article numbers within groups vary from server to server.

         This form or URL should not be quoted outside this local area.
         It should not be used within news articles for wider
         circulation than the one server.  This is a local identifier
         for a resource which is often available globally, and so is not
         recommended except in the case in which incomplete NNTP
         implementations on the local server force its adoption.

Prospero

   The Prospero (Neuman, 1991) directory service is used to resolve the
   URL yielding an access method for the object (which can then itself
   be represented as a URL if translated).  The host part contains a
   host name or internet address.  The port part is optional.

   The path part contains a host specific object name and an optional
   version number. If present, the version number is separated from the
   host specific object name by the characters "%00" (percent zero
   zero), this being an escaped string terminator (null).  External
   Prospero links are represented as URLs of the underlying access
   method and are not represented as Prospero URLs.

Registration of naming schemes

   A new naming scheme may be introduced by defining a mapping onto a
   conforming URL syntax, using a new prefix.  Experimental prefixes may
   be used by mutual agreement between parties, and must start with the



Berners-Lee                                                    [Page 21]

RFC 1630                      URIs in WWW                      June 1994


   characters "x-".  The scheme name "urn:" is reserved for the work in
   progress on a scheme for more persistent names.

   It is proposed that the Internet Assigned Numbers Authority (IANA)
   perform the function of registration of new schemes. Any submission
   of a new URI scheme must include a definition of an algorithm for the
   retrieval of any object within that scheme. The algorithm must take
   the URI and produce either a set of URL(s) which will lead to the
   desired object, or the object itself, in a well-defined or
   determinable format.

   It is recommended that those proposing a new scheme demonstrate its
   utility and operability by the provision of a gateway which will
   provide images of objects in the new scheme for clients using an
   existing protocol. If the new scheme is not a locator scheme, then
   the properties of names in the new space should be clearly defined.
   It is likewise recommended that, where a protocol allows for
   retrieval by URL, that the client software have provision for being
   configured to use specific gateway locators for indirect access
   through new naming schemes.

BNF of Generic URI Syntax

   This is a BNF-like description of the URI syntax. at the level at
   which specific schemes are not considered.

   A vertical line "|" indicates alternatives, and [brackets] indicate
   optional parts.  Spaces are represented by the word "space", and the
   vertical line character by "vline".  Single letters stand for single
   letters.  All words of more than one letter below are entities
   described somewhere in this description.

   The "generic" production gives a higher level parsing of the same
   URIs as the other productions.  The "national" and "punctuation"
   characters do not appear in any productions and therefore may not
   appear in URIs.

     fragmentaddress        uri [ # fragmentid ]

     uri                    scheme :  path [ ? search ]

     scheme                 ialpha

     path                   void |  xpalphas  [  / path ]

     search                 xalphas [ + search ]

     fragmentid             xalphas



Berners-Lee                                                    [Page 22]

RFC 1630                      URIs in WWW                      June 1994



     xalpha                 alpha | digit | safe | extra | escape

     xalphas                xalpha [ xalphas ]

     xpalpha                xalpha | +

     xpalphas               xpalpha [ xpalpha ]

     ialpha                 alpha [ xalphas ]

     alpha                  a | b | c | d | e | f | g | h | i | j | k |
                            l | m | n | o  | p | q | r | s | t | u | v |
                            w | x | y | z | A | B | C  | D | E | F | G |
                            H | I | J | K | L | M | N | O | P |  Q | R |
                            S | T | U | V | W | X | Y | Z

     digit                  0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

     safe                   $ | - | _ | @ | . | &

     extra                  ! | * | " |  ' | ( | ) | ,

     reserved               = | ; | / | # | ? | : | space

     escape                 % hex hex

     hex                    digit | a | b | c | d | e | f | A | B | C |
                            D | E | F

     national               { | } | vline | [ | ] | \ | ^ | ~

     punctuation            < | >

     void

      (end of URI BNF)

BNF for specific URL schemes

   This is a BNF-like description of the Uniform Resource Locator
   syntax.  A vertical line "|" indicates alternatives, and [brackets]
   indicate optional parts.  Spaces are represented by the word "space",
   and the vertical line character by "vline".  Single letters stand for
   single letters.  All words of more than one letter below are entities
   described somewhere in this description.





Berners-Lee                                                    [Page 23]

RFC 1630                      URIs in WWW                      June 1994


   The current IETF URI Working Group preference is for the prefixedurl
   production. (Nov 1993. July 93: url).

   The "national" and "punctuation" characters do not appear in any
   productions and therefore may not appear in URLs.

   The "afsaddress" is left in as historical note, but is not a url
   production.

  prefixedurl            u r l : url

  url                    httpaddress | ftpaddress | newsaddress |
                         nntpaddress | prosperoaddress | telnetaddress
                         | gopheraddress | waisaddress |
                         mailtoaddress  | midaddress | cidaddress

  scheme                 ialpha

  httpaddress            h t t p :   / / hostport [  / path ] [ ?
                         search ]

  ftpaddress             f t p : / / login / path [  ftptype ]

  afsaddress             a f s : / / cellname / path

  newsaddress            n e w s : groupart

  nntpaddress            n n t p : group /  digits

  midaddress             m i d  :  addr-spec

  cidaddress             c i d : content-identifier

  mailtoaddress          m a i l t o : xalphas @ hostname

  waisaddress            waisindex | waisdoc

  waisindex              w a i s : / / hostport / database [ ? search
                         ]

  waisdoc                w a i s : / / hostport / database / wtype  /
                         wpath

  wpath                  digits = path ;  [ wpath ]

  groupart               * | group | article

  group                  ialpha [ . group ]



Berners-Lee                                                    [Page 24]

RFC 1630                      URIs in WWW                      June 1994



  article                xalphas @ host

  database               xalphas

  wtype                  xalphas

  prosperoaddress        prosperolink

  prosperolink           p r o s p e r o : / / hostport / hsoname [ %
                         0 0 version [ attributes ] ]

  hsoname                path

  version                digits

  attributes             attribute [ attributes ]

  attribute              alphanums

  telnetaddress          t e l n e t : / / login

  gopheraddress          g o p h e r : / / hostport [/ gtype  [
                         gcommand ] ]

  login                  [ user [ : password ] @ ] hostport

  hostport               host [ : port ]

  host                   hostname | hostnumber

  ftptype                A formcode | E formcode | I | L digits

  formcode               N | T | C

  cellname               hostname

  hostname               ialpha [  .  hostname ]

  hostnumber             digits . digits . digits . digits

  port                   digits

  gcommand               path

  path                   void |  segment  [  / path ]

  segment                xpalphas



Berners-Lee                                                    [Page 25]

RFC 1630                      URIs in WWW                      June 1994



  search                 xalphas [ + search ]

  user                   alphanum2 [ user ]

  password               alphanum2 [ password ]

  fragmentid             xalphas

  gtype                  xalpha

  alphanum2              alpha | digit | - | _ | . | +

  xalpha                 alpha | digit | safe | extra | escape

  xalphas                xalpha [ xalphas ]

  xpalpha                xalpha | +

  xpalphas               xpalpha [ xpalphas ]

  ialpha                 alpha [ xalphas ]

  alpha                  a | b | c | d | e | f | g | h | i | j | k |
                         l | m | n | o  | p | q | r | s | t | u | v |
                         w | x | y | z | A | B | C  | D | E | F | G |
                         H | I | J | K | L | M | N | O | P |  Q | R |
                         S | T | U | V | W | X | Y | Z

  digit                  0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

  safe                   $ | - | _ | @ | . | &  | + | -

  extra                  ! | * |  " |  ' | ( | )  | ,

  reserved               =  |  ;  |  /  |  #  | ? |  : | space

  escape                 % hex hex

  hex                    digit | a | b | c | d | e | f | A | B | C |
                         D | E | F

  national               { | } | vline | [ | ] | \ | ^ | ~

  punctuation            < | >

  digits                 digit [ digits ]




Berners-Lee                                                    [Page 26]

RFC 1630                      URIs in WWW                      June 1994


  alphanum               alpha | digit

  alphanums              alphanum [ alphanums ]

  void

   (end of URL BNF)

References

  Alberti, R., et.al., "Notes on the Internet Gopher Protocol",
     University of Minnesota, December 1991,
     <ftp://boombox.micro.umn.edu/pub/gopher/ gopher_protocol>. See also
     <gopher://gopher.micro.umn.edu/00/Information About Gopher/About
     Gopher>

  Berners-Lee, T., "Hypertext Transfer Protocol (HTTP)", CERN, December
     1991, as updated from time to time,
     <ftp://info.cern.ch/pub/www/doc/http-spec.txt>

  Crocker, D., "Standard for ARPA Internet Text Messages" STD 11, RFC
     822, UDel, August 1982.

  Davis, F, et  al., "WAIS Interface Protocol: Prototype Functional
     Specification", Thinking Machines Corporation, April 23, 1990.
     <ftp://quake.think.com/pub/wa is/doc/protspec.txt>

  International Standards Organization, Information and Documentation -
     Search and Retrieve Application Protocol Specification for open
     Systems Interconnection, ISO-10163.

  Horton, M., and R. Adams, "Standard for Interchange of USENET
     messages", RFC 1036, AT&T Bell Laboratories, Center for Seismic
     Studies, December 1987.

  Huitema, C., "Naming: strategies and techniques", Computer Networks
     and ISDN Systems 23 (1991) 107-110.

  Kahle, B., "Document Identifiers, or International Standard Book
     Numbers for the Electronic Age", <ftp:
     //quake.think.com/pub/wais/doc/doc-ids.txt>

  Kantor, B., and P. Lapsley, Kantor, B., and P. Lapsley, "Network News
     Transfer Protocol", RFC 977, UC San Diego & UC Berkeley, February
     1986.  <ftp://ds.internic.net/rfc/rfc977.txt>

  Kunze, J., "Requirements for URLs", Work in Progress.




Berners-Lee                                                    [Page 27]

RFC 1630                      URIs in WWW                      June 1994


  Lynch, C., Coalition for Networked Information: "Workshop on ID and
     Reference Structures for Networked Information", November 1991. See
     <wais://quake.think.com/wais-discussion-archives?lynch>

  Mockapetris, P., "Domain Names - Concepts and Facilities", STD 13, RFC
     1034, USC/Information Sciences Institute, November 1987,
     <ftp://ds.internic.net/rfc/rfc1034.txt>

  Neuman, B. Clifford, "Prospero: A Tool for Organizing Internet
     Resources", Electronic Networking: Research, Applications and
     Policy, Vol 1 No 2, Meckler Westport CT USA, 1992.  See also
     <ftp://prospero.isi.edu/pub/prospero/oir.ps>

  Postel, J., and J. Reynolds, "File Transfer Protocol (FTP)", STD 9,
     RFC 959, USC/Information Sciences Institute, October 1985.
     <ftp://ds.internic.net/rfc/rfc959.txt>

  Sollins, K., and L. Masinter, "Requiremnets for URNs", Work in
     Progress.

  Yeong, W., "Towards Networked Information Retrieval", Technical report
     91-06-25-01, June 1991, Performance Systems International, Inc.
     <ftp://uu.psi.com/wp/nir.txt>

  Yeong, W., "Representing Public Archives in the Directory", Work in
     Progress, November 1991, now expired.

Security Considerations

   Security issues are not discussed in this memo.

Author's Address

   Tim Berners-Lee
   World-Wide Web project
   CERN
   1211 Geneva 23,
   Switzerland

   Phone: +41 (22)767 3755
   Fax:   +41 (22)767 7155
   EMail: timbl@info.cern.ch









Berners-Lee                                                    [Page 28]


Added doc/rfc1945.txt.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                     T. Berners-Lee
Request for Comments: 1945                                       MIT/LCS
Category: Informational                                      R. Fielding
                                                               UC Irvine
                                                              H. Frystyk
                                                                 MIT/LCS
                                                                May 1996


                Hypertext Transfer Protocol -- HTTP/1.0

Status of This Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

IESG Note:

   The IESG has concerns about this protocol, and expects this document
   to be replaced relatively soon by a standards track document.

Abstract

   The Hypertext Transfer Protocol (HTTP) is an application-level
   protocol with the lightness and speed necessary for distributed,
   collaborative, hypermedia information systems. It is a generic,
   stateless, object-oriented protocol which can be used for many tasks,
   such as name servers and distributed object management systems,
   through extension of its request methods (commands). A feature of
   HTTP is the typing of data representation, allowing systems to be
   built independently of the data being transferred.

   HTTP has been in use by the World-Wide Web global information
   initiative since 1990. This specification reflects common usage of
   the protocol referred to as "HTTP/1.0".

Table of Contents

   1.  Introduction ..............................................  4
       1.1  Purpose ..............................................  4
       1.2  Terminology ..........................................  4
       1.3  Overall Operation ....................................  6
       1.4  HTTP and MIME ........................................  8
   2.  Notational Conventions and Generic Grammar ................  8
       2.1  Augmented BNF ........................................  8
       2.2  Basic Rules .......................................... 10
   3.  Protocol Parameters ....................................... 12



Berners-Lee, et al           Informational                      [Page 1]

RFC 1945                        HTTP/1.0                        May 1996


       3.1  HTTP Version ......................................... 12
       3.2  Uniform Resource Identifiers ......................... 14
            3.2.1  General Syntax ................................ 14
            3.2.2  http URL ...................................... 15
       3.3  Date/Time Formats .................................... 15
       3.4  Character Sets ....................................... 17
       3.5  Content Codings ...................................... 18
       3.6  Media Types .......................................... 19
            3.6.1  Canonicalization and Text Defaults ............ 19
            3.6.2  Multipart Types ............................... 20
       3.7  Product Tokens ....................................... 20
   4.  HTTP Message .............................................. 21
       4.1  Message Types ........................................ 21
       4.2  Message Headers ...................................... 22
       4.3  General Header Fields ................................ 23
   5.  Request ................................................... 23
       5.1  Request-Line ......................................... 23
            5.1.1  Method ........................................ 24
            5.1.2  Request-URI ................................... 24
       5.2  Request Header Fields ................................ 25
   6.  Response .................................................. 25
       6.1  Status-Line .......................................... 26
            6.1.1  Status Code and Reason Phrase ................. 26
       6.2  Response Header Fields ............................... 28
   7.  Entity .................................................... 28
       7.1  Entity Header Fields ................................. 29
       7.2  Entity Body .......................................... 29
            7.2.1  Type .......................................... 29
            7.2.2  Length ........................................ 30
   8.  Method Definitions ........................................ 30
       8.1  GET .................................................. 31
       8.2  HEAD ................................................. 31
       8.3  POST ................................................. 31
   9.  Status Code Definitions ................................... 32
       9.1  Informational 1xx .................................... 32
       9.2  Successful 2xx ....................................... 32
       9.3  Redirection 3xx ...................................... 34
       9.4  Client Error 4xx ..................................... 35
       9.5  Server Error 5xx ..................................... 37
   10. Header Field Definitions .................................. 37
       10.1  Allow ............................................... 38
       10.2  Authorization ....................................... 38
       10.3  Content-Encoding .................................... 39
       10.4  Content-Length ...................................... 39
       10.5  Content-Type ........................................ 40
       10.6  Date ................................................ 40
       10.7  Expires ............................................. 41
       10.8  From ................................................ 42



Berners-Lee, et al           Informational                      [Page 2]

RFC 1945                        HTTP/1.0                        May 1996


       10.9  If-Modified-Since ................................... 42
       10.10 Last-Modified ....................................... 43
       10.11 Location ............................................ 44
       10.12 Pragma .............................................. 44
       10.13 Referer ............................................. 44
       10.14 Server .............................................. 45
       10.15 User-Agent .......................................... 46
       10.16 WWW-Authenticate .................................... 46
   11. Access Authentication ..................................... 47
       11.1  Basic Authentication Scheme ......................... 48
   12. Security Considerations ................................... 49
       12.1  Authentication of Clients ........................... 49
       12.2  Safe Methods ........................................ 49
       12.3  Abuse of Server Log Information ..................... 50
       12.4  Transfer of Sensitive Information ................... 50
       12.5  Attacks Based On File and Path Names ................ 51
   13. Acknowledgments ........................................... 51
   14. References ................................................ 52
   15. Authors' Addresses ........................................ 54
   Appendix A.   Internet Media Type message/http ................ 55
   Appendix B.   Tolerant Applications ........................... 55
   Appendix C.   Relationship to MIME ............................ 56
       C.1  Conversion to Canonical Form ......................... 56
       C.2  Conversion of Date Formats ........................... 57
       C.3  Introduction of Content-Encoding ..................... 57
       C.4  No Content-Transfer-Encoding ......................... 57
       C.5  HTTP Header Fields in Multipart Body-Parts ........... 57
   Appendix D.   Additional Features ............................. 57
       D.1  Additional Request Methods ........................... 58
            D.1.1  PUT ........................................... 58
            D.1.2  DELETE ........................................ 58
            D.1.3  LINK .......................................... 58
            D.1.4  UNLINK ........................................ 58
       D.2  Additional Header Field Definitions .................. 58
            D.2.1  Accept ........................................ 58
            D.2.2  Accept-Charset ................................ 59
            D.2.3  Accept-Encoding ............................... 59
            D.2.4  Accept-Language ............................... 59
            D.2.5  Content-Language .............................. 59
            D.2.6  Link .......................................... 59
            D.2.7  MIME-Version .................................. 59
            D.2.8  Retry-After ................................... 60
            D.2.9  Title ......................................... 60
            D.2.10 URI ........................................... 60







Berners-Lee, et al           Informational                      [Page 3]

RFC 1945                        HTTP/1.0                        May 1996


1.  Introduction

1.1  Purpose

   The Hypertext Transfer Protocol (HTTP) is an application-level
   protocol with the lightness and speed necessary for distributed,
   collaborative, hypermedia information systems. HTTP has been in use
   by the World-Wide Web global information initiative since 1990. This
   specification reflects common usage of the protocol referred too as
   "HTTP/1.0". This specification describes the features that seem to be
   consistently implemented in most HTTP/1.0 clients and servers. The
   specification is split into two sections. Those features of HTTP for
   which implementations are usually consistent are described in the
   main body of this document. Those features which have few or
   inconsistent implementations are listed in Appendix D.

   Practical information systems require more functionality than simple
   retrieval, including search, front-end update, and annotation. HTTP
   allows an open-ended set of methods to be used to indicate the
   purpose of a request. It builds on the discipline of reference
   provided by the Uniform Resource Identifier (URI) [2], as a location
   (URL) [4] or name (URN) [16], for indicating the resource on which a
   method is to be applied. Messages are passed in a format similar to
   that used by Internet Mail [7] and the Multipurpose Internet Mail
   Extensions (MIME) [5].

   HTTP is also used as a generic protocol for communication between
   user agents and proxies/gateways to other Internet protocols, such as
   SMTP [12], NNTP [11], FTP [14], Gopher [1], and WAIS [8], allowing
   basic hypermedia access to resources available from diverse
   applications and simplifying the implementation of user agents.

1.2  Terminology

   This specification uses a number of terms to refer to the roles
   played by participants in, and objects of, the HTTP communication.

   connection

       A transport layer virtual circuit established between two
       application programs for the purpose of communication.

   message

       The basic unit of HTTP communication, consisting of a structured
       sequence of octets matching the syntax defined in Section 4 and
       transmitted via the connection.




Berners-Lee, et al           Informational                      [Page 4]

RFC 1945                        HTTP/1.0                        May 1996


   request

       An HTTP request message (as defined in Section 5).

   response

       An HTTP response message (as defined in Section 6).

   resource

       A network data object or service which can be identified by a
       URI (Section 3.2).

   entity

       A particular representation or rendition of a data resource, or
       reply from a service resource, that may be enclosed within a
       request or response message. An entity consists of
       metainformation in the form of entity headers and content in the
       form of an entity body.

   client

       An application program that establishes connections for the
       purpose of sending requests.

   user agent

       The client which initiates a request. These are often browsers,
       editors, spiders (web-traversing robots), or other end user
       tools.

   server

       An application program that accepts connections in order to
       service requests by sending back responses.

   origin server

       The server on which a given resource resides or is to be created.

   proxy

       An intermediary program which acts as both a server and a client
       for the purpose of making requests on behalf of other clients.
       Requests are serviced internally or by passing them, with
       possible translation, on to other servers. A proxy must
       interpret and, if necessary, rewrite a request message before



Berners-Lee, et al           Informational                      [Page 5]

RFC 1945                        HTTP/1.0                        May 1996


       forwarding it. Proxies are often used as client-side portals
       through network firewalls and as helper applications for
       handling requests via protocols not implemented by the user
       agent.

   gateway

       A server which acts as an intermediary for some other server.
       Unlike a proxy, a gateway receives requests as if it were the
       origin server for the requested resource; the requesting client
       may not be aware that it is communicating with a gateway.
       Gateways are often used as server-side portals through network
       firewalls and as protocol translators for access to resources
       stored on non-HTTP systems.

   tunnel

       A tunnel is an intermediary program which is acting as a blind
       relay between two connections. Once active, a tunnel is not
       considered a party to the HTTP communication, though the tunnel
       may have been initiated by an HTTP request. The tunnel ceases to
       exist when both ends of the relayed connections are closed.
       Tunnels are used when a portal is necessary and the intermediary
       cannot, or should not, interpret the relayed communication.

   cache

       A program's local store of response messages and the subsystem
       that controls its message storage, retrieval, and deletion. A
       cache stores cachable responses in order to reduce the response
       time and network bandwidth consumption on future, equivalent
       requests. Any client or server may include a cache, though a
       cache cannot be used by a server while it is acting as a tunnel.

   Any given program may be capable of being both a client and a server;
   our use of these terms refers only to the role being performed by the
   program for a particular connection, rather than to the program's
   capabilities in general. Likewise, any server may act as an origin
   server, proxy, gateway, or tunnel, switching behavior based on the
   nature of each request.

1.3  Overall Operation

   The HTTP protocol is based on a request/response paradigm. A client
   establishes a connection with a server and sends a request to the
   server in the form of a request method, URI, and protocol version,
   followed by a MIME-like message containing request modifiers, client
   information, and possible body content. The server responds with a



Berners-Lee, et al           Informational                      [Page 6]

RFC 1945                        HTTP/1.0                        May 1996


   status line, including the message's protocol version and a success
   or error code, followed by a MIME-like message containing server
   information, entity metainformation, and possible body content.

   Most HTTP communication is initiated by a user agent and consists of
   a request to be applied to a resource on some origin server. In the
   simplest case, this may be accomplished via a single connection (v)
   between the user agent (UA) and the origin server (O).

          request chain ------------------------>
       UA -------------------v------------------- O
          <----------------------- response chain

   A more complicated situation occurs when one or more intermediaries
   are present in the request/response chain. There are three common
   forms of intermediary: proxy, gateway, and tunnel. A proxy is a
   forwarding agent, receiving requests for a URI in its absolute form,
   rewriting all or parts of the message, and forwarding the reformatted
   request toward the server identified by the URI. A gateway is a
   receiving agent, acting as a layer above some other server(s) and, if
   necessary, translating the requests to the underlying server's
   protocol. A tunnel acts as a relay point between two connections
   without changing the messages; tunnels are used when the
   communication needs to pass through an intermediary (such as a
   firewall) even when the intermediary cannot understand the contents
   of the messages.

          request chain -------------------------------------->
       UA -----v----- A -----v----- B -----v----- C -----v----- O
          <------------------------------------- response chain

   The figure above shows three intermediaries (A, B, and C) between the
   user agent and origin server. A request or response message that
   travels the whole chain must pass through four separate connections.
   This distinction is important because some HTTP communication options
   may apply only to the connection with the nearest, non-tunnel
   neighbor, only to the end-points of the chain, or to all connections
   along the chain. Although the diagram is linear, each participant may
   be engaged in multiple, simultaneous communications. For example, B
   may be receiving requests from many clients other than A, and/or
   forwarding requests to servers other than C, at the same time that it
   is handling A's request.

   Any party to the communication which is not acting as a tunnel may
   employ an internal cache for handling requests. The effect of a cache
   is that the request/response chain is shortened if one of the
   participants along the chain has a cached response applicable to that
   request. The following illustrates the resulting chain if B has a



Berners-Lee, et al           Informational                      [Page 7]

RFC 1945                        HTTP/1.0                        May 1996


   cached copy of an earlier response from O (via C) for a request which
   has not been cached by UA or A.

          request chain ---------->
       UA -----v----- A -----v----- B - - - - - - C - - - - - - O
          <--------- response chain

   Not all responses are cachable, and some requests may contain
   modifiers which place special requirements on cache behavior. Some
   HTTP/1.0 applications use heuristics to describe what is or is not a
   "cachable" response, but these rules are not standardized.

   On the Internet, HTTP communication generally takes place over TCP/IP
   connections. The default port is TCP 80 [15], but other ports can be
   used. This does not preclude HTTP from being implemented on top of
   any other protocol on the Internet, or on other networks. HTTP only
   presumes a reliable transport; any protocol that provides such
   guarantees can be used, and the mapping of the HTTP/1.0 request and
   response structures onto the transport data units of the protocol in
   question is outside the scope of this specification.

   Except for experimental applications, current practice requires that
   the connection be established by the client prior to each request and
   closed by the server after sending the response. Both clients and
   servers should be aware that either party may close the connection
   prematurely, due to user action, automated time-out, or program
   failure, and should handle such closing in a predictable fashion. In
   any case, the closing of the connection by either or both parties
   always terminates the current request, regardless of its status.

1.4  HTTP and MIME

   HTTP/1.0 uses many of the constructs defined for MIME, as defined in
   RFC 1521 [5]. Appendix C describes the ways in which the context of
   HTTP allows for different use of Internet Media Types than is
   typically found in Internet mail, and gives the rationale for those
   differences.

2.  Notational Conventions and Generic Grammar

2.1  Augmented BNF

   All of the mechanisms specified in this document are described in
   both prose and an augmented Backus-Naur Form (BNF) similar to that
   used by RFC 822 [7]. Implementors will need to be familiar with the
   notation in order to understand this specification. The augmented BNF
   includes the following constructs:




Berners-Lee, et al           Informational                      [Page 8]

RFC 1945                        HTTP/1.0                        May 1996


   name = definition

       The name of a rule is simply the name itself (without any
       enclosing "<" and ">") and is separated from its definition by
       the equal character "=". Whitespace is only significant in that
       indentation of continuation lines is used to indicate a rule
       definition that spans more than one line. Certain basic rules
       are in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc.
       Angle brackets are used within definitions whenever their
       presence will facilitate discerning the use of rule names.

   "literal"

       Quotation marks surround literal text. Unless stated otherwise,
       the text is case-insensitive.

   rule1 | rule2

       Elements separated by a bar ("I") are alternatives,
       e.g., "yes | no" will accept yes or no.

   (rule1 rule2)

       Elements enclosed in parentheses are treated as a single
       element. Thus, "(elem (foo | bar) elem)" allows the token
       sequences "elem foo elem" and "elem bar elem".

   *rule

       The character "*" preceding an element indicates repetition. The
       full form is "<n>*<m>element" indicating at least <n> and at
       most <m> occurrences of element. Default values are 0 and
       infinity so that "*(element)" allows any number, including zero;
       "1*element" requires at least one; and "1*2element" allows one
       or two.

   [rule]

       Square brackets enclose optional elements; "[foo bar]" is
       equivalent to "*1(foo bar)".

   N rule

       Specific repetition: "<n>(element)" is equivalent to
       "<n>*<n>(element)"; that is, exactly <n> occurrences of
       (element). Thus 2DIGIT is a 2-digit number, and 3ALPHA is a
       string of three alphabetic characters.




Berners-Lee, et al           Informational                      [Page 9]

RFC 1945                        HTTP/1.0                        May 1996


   #rule

       A construct "#" is defined, similar to "*", for defining lists
       of elements. The full form is "<n>#<m>element" indicating at
       least <n> and at most <m> elements, each separated by one or
       more commas (",") and optional linear whitespace (LWS). This
       makes the usual form of lists very easy; a rule such as
       "( *LWS element *( *LWS "," *LWS element ))" can be shown as
       "1#element". Wherever this construct is used, null elements are
       allowed, but do not contribute to the count of elements present.
       That is, "(element), , (element)" is permitted, but counts as
       only two elements. Therefore, where at least one element is
       required, at least one non-null element must be present. Default
       values are 0 and infinity so that "#(element)" allows any
       number, including zero; "1#element" requires at least one; and
       "1#2element" allows one or two.

   ; comment

       A semi-colon, set off some distance to the right of rule text,
       starts a comment that continues to the end of line. This is a
       simple way of including useful notes in parallel with the
       specifications.

   implied *LWS

       The grammar described by this specification is word-based.
       Except where noted otherwise, linear whitespace (LWS) can be
       included between any two adjacent words (token or
       quoted-string), and between adjacent tokens and delimiters
       (tspecials), without changing the interpretation of a field. At
       least one delimiter (tspecials) must exist between any two
       tokens, since they would otherwise be interpreted as a single
       token. However, applications should attempt to follow "common
       form" when generating HTTP constructs, since there exist some
       implementations that fail to accept anything beyond the common
       forms.

2.2  Basic Rules

   The following rules are used throughout this specification to
   describe basic parsing constructs. The US-ASCII coded character set
   is defined by [17].

       OCTET          = <any 8-bit sequence of data>
       CHAR           = <any US-ASCII character (octets 0 - 127)>
       UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
       LOALPHA        = <any US-ASCII lowercase letter "a".."z">



Berners-Lee, et al           Informational                     [Page 10]

RFC 1945                        HTTP/1.0                        May 1996


       ALPHA          = UPALPHA | LOALPHA
       DIGIT          = <any US-ASCII digit "0".."9">
       CTL            = <any US-ASCII control character
                        (octets 0 - 31) and DEL (127)>
       CR             = <US-ASCII CR, carriage return (13)>
       LF             = <US-ASCII LF, linefeed (10)>
       SP             = <US-ASCII SP, space (32)>
       HT             = <US-ASCII HT, horizontal-tab (9)>
       <">            = <US-ASCII double-quote mark (34)>

   HTTP/1.0 defines the octet sequence CR LF as the end-of-line marker
   for all protocol elements except the Entity-Body (see Appendix B for
   tolerant applications). The end-of-line marker within an Entity-Body
   is defined by its associated media type, as described in Section 3.6.

       CRLF           = CR LF

   HTTP/1.0 headers may be folded onto multiple lines if each
   continuation line begins with a space or horizontal tab. All linear
   whitespace, including folding, has the same semantics as SP.

       LWS            = [CRLF] 1*( SP | HT )

   However, folding of header lines is not expected by some
   applications, and should not be generated by HTTP/1.0 applications.

   The TEXT rule is only used for descriptive field contents and values
   that are not intended to be interpreted by the message parser. Words
   of *TEXT may contain octets from character sets other than US-ASCII.

       TEXT           = <any OCTET except CTLs,
                        but including LWS>

   Recipients of header field TEXT containing octets outside the US-
   ASCII character set may assume that they represent ISO-8859-1
   characters.

   Hexadecimal numeric characters are used in several protocol elements.

       HEX            = "A" | "B" | "C" | "D" | "E" | "F"
                      | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT

   Many HTTP/1.0 header field values consist of words separated by LWS
   or special characters. These special characters must be in a quoted
   string to be used within a parameter value.

       word           = token | quoted-string




Berners-Lee, et al           Informational                     [Page 11]

RFC 1945                        HTTP/1.0                        May 1996


       token          = 1*<any CHAR except CTLs or tspecials>

       tspecials      = "(" | ")" | "<" | ">" | "@"
                      | "," | ";" | ":" | "\" | <">
                      | "/" | "[" | "]" | "?" | "="
                      | "{" | "}" | SP | HT

   Comments may be included in some HTTP header fields by surrounding
   the comment text with parentheses. Comments are only allowed in
   fields containing "comment" as part of their field value definition.
   In all other fields, parentheses are considered part of the field
   value.

       comment        = "(" *( ctext | comment ) ")"
       ctext          = <any TEXT excluding "(" and ")">

   A string of text is parsed as a single word if it is quoted using
   double-quote marks.

       quoted-string  = ( <"> *(qdtext) <"> )

       qdtext         = <any CHAR except <"> and CTLs,
                        but including LWS>

   Single-character quoting using the backslash ("\") character is not
   permitted in HTTP/1.0.

3.  Protocol Parameters

3.1  HTTP Version

   HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
   of the protocol. The protocol versioning policy is intended to allow
   the sender to indicate the format of a message and its capacity for
   understanding further HTTP communication, rather than the features
   obtained via that communication. No change is made to the version
   number for the addition of message components which do not affect
   communication behavior or which only add to extensible field values.
   The <minor> number is incremented when the changes made to the
   protocol add features which do not change the general message parsing
   algorithm, but which may add to the message semantics and imply
   additional capabilities of the sender. The <major> number is
   incremented when the format of a message within the protocol is
   changed.

   The version of an HTTP message is indicated by an HTTP-Version field
   in the first line of the message. If the protocol version is not
   specified, the recipient must assume that the message is in the



Berners-Lee, et al           Informational                     [Page 12]

RFC 1945                        HTTP/1.0                        May 1996


   simple HTTP/0.9 format.

       HTTP-Version   = "HTTP" "/" 1*DIGIT "." 1*DIGIT

   Note that the major and minor numbers should be treated as separate
   integers and that each may be incremented higher than a single digit.
   Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
   lower than HTTP/12.3. Leading zeros should be ignored by recipients
   and never generated by senders.

   This document defines both the 0.9 and 1.0 versions of the HTTP
   protocol. Applications sending Full-Request or Full-Response
   messages, as defined by this specification, must include an HTTP-
   Version of "HTTP/1.0".

   HTTP/1.0 servers must:

      o recognize the format of the Request-Line for HTTP/0.9 and
        HTTP/1.0 requests;

      o understand any valid request in the format of HTTP/0.9 or
        HTTP/1.0;

      o respond appropriately with a message in the same protocol
        version used by the client.

   HTTP/1.0 clients must:

      o recognize the format of the Status-Line for HTTP/1.0 responses;

      o understand any valid response in the format of HTTP/0.9 or
        HTTP/1.0.

   Proxy and gateway applications must be careful in forwarding requests
   that are received in a format different than that of the
   application's native HTTP version. Since the protocol version
   indicates the protocol capability of the sender, a proxy/gateway must
   never send a message with a version indicator which is greater than
   its native version; if a higher version request is received, the
   proxy/gateway must either downgrade the request version or respond
   with an error. Requests with a version lower than that of the
   application's native format may be upgraded before being forwarded;
   the proxy/gateway's response to that request must follow the server
   requirements listed above.







Berners-Lee, et al           Informational                     [Page 13]

RFC 1945                        HTTP/1.0                        May 1996


3.2  Uniform Resource Identifiers

   URIs have been known by many names: WWW addresses, Universal Document
   Identifiers, Universal Resource Identifiers [2], and finally the
   combination of Uniform Resource Locators (URL) [4] and Names (URN)
   [16]. As far as HTTP is concerned, Uniform Resource Identifiers are
   simply formatted strings which identify--via name, location, or any
   other characteristic--a network resource.

3.2.1 General Syntax

   URIs in HTTP can be represented in absolute form or relative to some
   known base URI [9], depending upon the context of their use. The two
   forms are differentiated by the fact that absolute URIs always begin
   with a scheme name followed by a colon.

       URI            = ( absoluteURI | relativeURI ) [ "#" fragment ]

       absoluteURI    = scheme ":" *( uchar | reserved )

       relativeURI    = net_path | abs_path | rel_path

       net_path       = "//" net_loc [ abs_path ]
       abs_path       = "/" rel_path
       rel_path       = [ path ] [ ";" params ] [ "?" query ]

       path           = fsegment *( "/" segment )
       fsegment       = 1*pchar
       segment        = *pchar

       params         = param *( ";" param )
       param          = *( pchar | "/" )

       scheme         = 1*( ALPHA | DIGIT | "+" | "-" | "." )
       net_loc        = *( pchar | ";" | "?" )
       query          = *( uchar | reserved )
       fragment       = *( uchar | reserved )

       pchar          = uchar | ":" | "@" | "&" | "=" | "+"
       uchar          = unreserved | escape
       unreserved     = ALPHA | DIGIT | safe | extra | national

       escape         = "%" HEX HEX
       reserved       = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
       extra          = "!" | "*" | "'" | "(" | ")" | ","
       safe           = "$" | "-" | "_" | "."
       unsafe         = CTL | SP | <"> | "#" | "%" | "<" | ">"
       national       = <any OCTET excluding ALPHA, DIGIT,



Berners-Lee, et al           Informational                     [Page 14]

RFC 1945                        HTTP/1.0                        May 1996


                        reserved, extra, safe, and unsafe>

   For definitive information on URL syntax and semantics, see RFC 1738
   [4] and RFC 1808 [9]. The BNF above includes national characters not
   allowed in valid URLs as specified by RFC 1738, since HTTP servers
   are not restricted in the set of unreserved characters allowed to
   represent the rel_path part of addresses, and HTTP proxies may
   receive requests for URIs not defined by RFC 1738.

3.2.2 http URL

   The "http" scheme is used to locate network resources via the HTTP
   protocol. This section defines the scheme-specific syntax and
   semantics for http URLs.

       http_URL       = "http:" "//" host [ ":" port ] [ abs_path ]

       host           = <A legal Internet host domain name
                         or IP address (in dotted-decimal form),
                         as defined by Section 2.1 of RFC 1123>

       port           = *DIGIT

   If the port is empty or not given, port 80 is assumed. The semantics
   are that the identified resource is located at the server listening
   for TCP connections on that port of that host, and the Request-URI
   for the resource is abs_path. If the abs_path is not present in the
   URL, it must be given as "/" when used as a Request-URI (Section
   5.1.2).

      Note: Although the HTTP protocol is independent of the transport
      layer protocol, the http URL only identifies resources by their
      TCP location, and thus non-TCP resources must be identified by
      some other URI scheme.

   The canonical form for "http" URLs is obtained by converting any
   UPALPHA characters in host to their LOALPHA equivalent (hostnames are
   case-insensitive), eliding the [ ":" port ] if the port is 80, and
   replacing an empty abs_path with "/".

3.3  Date/Time Formats

   HTTP/1.0 applications have historically allowed three different
   formats for the representation of date/time stamps:

       Sun, 06 Nov 1994 08:49:37 GMT    ; RFC 822, updated by RFC 1123
       Sunday, 06-Nov-94 08:49:37 GMT   ; RFC 850, obsoleted by RFC 1036
       Sun Nov  6 08:49:37 1994         ; ANSI C's asctime() format



Berners-Lee, et al           Informational                     [Page 15]

RFC 1945                        HTTP/1.0                        May 1996


   The first format is preferred as an Internet standard and represents
   a fixed-length subset of that defined by RFC 1123 [6] (an update to
   RFC 822 [7]). The second format is in common use, but is based on the
   obsolete RFC 850 [10] date format and lacks a four-digit year.
   HTTP/1.0 clients and servers that parse the date value should accept
   all three formats, though they must never generate the third
   (asctime) format.

      Note: Recipients of date values are encouraged to be robust in
      accepting date values that may have been generated by non-HTTP
      applications, as is sometimes the case when retrieving or posting
      messages via proxies/gateways to SMTP or NNTP.

   All HTTP/1.0 date/time stamps must be represented in Universal Time
   (UT), also known as Greenwich Mean Time (GMT), without exception.
   This is indicated in the first two formats by the inclusion of "GMT"
   as the three-letter abbreviation for time zone, and should be assumed
   when reading the asctime format.

       HTTP-date      = rfc1123-date | rfc850-date | asctime-date

       rfc1123-date   = wkday "," SP date1 SP time SP "GMT"
       rfc850-date    = weekday "," SP date2 SP time SP "GMT"
       asctime-date   = wkday SP date3 SP time SP 4DIGIT

       date1          = 2DIGIT SP month SP 4DIGIT
                        ; day month year (e.g., 02 Jun 1982)
       date2          = 2DIGIT "-" month "-" 2DIGIT
                        ; day-month-year (e.g., 02-Jun-82)
       date3          = month SP ( 2DIGIT | ( SP 1DIGIT ))
                        ; month day (e.g., Jun  2)

       time           = 2DIGIT ":" 2DIGIT ":" 2DIGIT
                        ; 00:00:00 - 23:59:59

       wkday          = "Mon" | "Tue" | "Wed"
                      | "Thu" | "Fri" | "Sat" | "Sun"

       weekday        = "Monday" | "Tuesday" | "Wednesday"
                      | "Thursday" | "Friday" | "Saturday" | "Sunday"

       month          = "Jan" | "Feb" | "Mar" | "Apr"
                      | "May" | "Jun" | "Jul" | "Aug"
                      | "Sep" | "Oct" | "Nov" | "Dec"

       Note: HTTP requirements for the date/time stamp format apply
       only to their usage within the protocol stream. Clients and
       servers are not required to use these formats for user



Berners-Lee, et al           Informational                     [Page 16]

RFC 1945                        HTTP/1.0                        May 1996


       presentation, request logging, etc.

3.4  Character Sets

   HTTP uses the same definition of the term "character set" as that
   described for MIME:

      The term "character set" is used in this document to refer to a
      method used with one or more tables to convert a sequence of
      octets into a sequence of characters. Note that unconditional
      conversion in the other direction is not required, in that not all
      characters may be available in a given character set and a
      character set may provide more than one sequence of octets to
      represent a particular character. This definition is intended to
      allow various kinds of character encodings, from simple single-
      table mappings such as US-ASCII to complex table switching methods
      such as those that use ISO 2022's techniques. However, the
      definition associated with a MIME character set name must fully
      specify the mapping to be performed from octets to characters. In
      particular, use of external profiling information to determine the
      exact mapping is not permitted.

      Note: This use of the term "character set" is more commonly
      referred to as a "character encoding." However, since HTTP and
      MIME share the same registry, it is important that the terminology
      also be shared.

   HTTP character sets are identified by case-insensitive tokens. The
   complete set of tokens are defined by the IANA Character Set registry
   [15]. However, because that registry does not define a single,
   consistent token for each character set, we define here the preferred
   names for those character sets most likely to be used with HTTP
   entities. These character sets include those registered by RFC 1521
   [5] -- the US-ASCII [17] and ISO-8859 [18] character sets -- and
   other names specifically recommended for use within MIME charset
   parameters.

     charset = "US-ASCII"
             | "ISO-8859-1" | "ISO-8859-2" | "ISO-8859-3"
             | "ISO-8859-4" | "ISO-8859-5" | "ISO-8859-6"
             | "ISO-8859-7" | "ISO-8859-8" | "ISO-8859-9"
             | "ISO-2022-JP" | "ISO-2022-JP-2" | "ISO-2022-KR"
             | "UNICODE-1-1" | "UNICODE-1-1-UTF-7" | "UNICODE-1-1-UTF-8"
             | token

   Although HTTP allows an arbitrary token to be used as a charset
   value, any token that has a predefined value within the IANA
   Character Set registry [15] must represent the character set defined



Berners-Lee, et al           Informational                     [Page 17]

RFC 1945                        HTTP/1.0                        May 1996


   by that registry. Applications should limit their use of character
   sets to those defined by the IANA registry.

   The character set of an entity body should be labelled as the lowest
   common denominator of the character codes used within that body, with
   the exception that no label is preferred over the labels US-ASCII or
   ISO-8859-1.

3.5  Content Codings

   Content coding values are used to indicate an encoding transformation
   that has been applied to a resource. Content codings are primarily
   used to allow a document to be compressed or encrypted without losing
   the identity of its underlying media type. Typically, the resource is
   stored in this encoding and only decoded before rendering or
   analogous usage.

       content-coding = "x-gzip" | "x-compress" | token

       Note: For future compatibility, HTTP/1.0 applications should
       consider "gzip" and "compress" to be equivalent to "x-gzip"
       and "x-compress", respectively.

   All content-coding values are case-insensitive. HTTP/1.0 uses
   content-coding values in the Content-Encoding (Section 10.3) header
   field. Although the value describes the content-coding, what is more
   important is that it indicates what decoding mechanism will be
   required to remove the encoding. Note that a single program may be
   capable of decoding multiple content-coding formats. Two values are
   defined by this specification:

   x-gzip
       An encoding format produced by the file compression program
       "gzip" (GNU zip) developed by Jean-loup Gailly. This format is
       typically a Lempel-Ziv coding (LZ77) with a 32 bit CRC.

   x-compress
       The encoding format produced by the file compression program
       "compress". This format is an adaptive Lempel-Ziv-Welch coding
       (LZW).

       Note: Use of program names for the identification of
       encoding formats is not desirable and should be discouraged
       for future encodings. Their use here is representative of
       historical practice, not good design.






Berners-Lee, et al           Informational                     [Page 18]

RFC 1945                        HTTP/1.0                        May 1996


3.6  Media Types

   HTTP uses Internet Media Types [13] in the Content-Type header field
   (Section 10.5) in order to provide open and extensible data typing.

       media-type     = type "/" subtype *( ";" parameter )
       type           = token
       subtype        = token

   Parameters may follow the type/subtype in the form of attribute/value
   pairs.

       parameter      = attribute "=" value
       attribute      = token
       value          = token | quoted-string

   The type, subtype, and parameter attribute names are case-
   insensitive. Parameter values may or may not be case-sensitive,
   depending on the semantics of the parameter name. LWS must not be
   generated between the type and subtype, nor between an attribute and
   its value. Upon receipt of a media type with an unrecognized
   parameter, a user agent should treat the media type as if the
   unrecognized parameter and its value were not present.

   Some older HTTP applications do not recognize media type parameters.
   HTTP/1.0 applications should only use media type parameters when they
   are necessary to define the content of a message.

   Media-type values are registered with the Internet Assigned Number
   Authority (IANA [15]). The media type registration process is
   outlined in RFC 1590 [13]. Use of non-registered media types is
   discouraged.

3.6.1 Canonicalization and Text Defaults

   Internet media types are registered with a canonical form. In
   general, an Entity-Body transferred via HTTP must be represented in
   the appropriate canonical form prior to its transmission. If the body
   has been encoded with a Content-Encoding, the underlying data should
   be in canonical form prior to being encoded.

   Media subtypes of the "text" type use CRLF as the text line break
   when in canonical form. However, HTTP allows the transport of text
   media with plain CR or LF alone representing a line break when used
   consistently within the Entity-Body. HTTP applications must accept
   CRLF, bare CR, and bare LF as being representative of a line break in
   text media received via HTTP.




Berners-Lee, et al           Informational                     [Page 19]

RFC 1945                        HTTP/1.0                        May 1996


   In addition, if the text media is represented in a character set that
   does not use octets 13 and 10 for CR and LF respectively, as is the
   case for some multi-byte character sets, HTTP allows the use of
   whatever octet sequences are defined by that character set to
   represent the equivalent of CR and LF for line breaks. This
   flexibility regarding line breaks applies only to text media in the
   Entity-Body; a bare CR or LF should not be substituted for CRLF
   within any of the HTTP control structures (such as header fields and
   multipart boundaries).

   The "charset" parameter is used with some media types to define the
   character set (Section 3.4) of the data. When no explicit charset
   parameter is provided by the sender, media subtypes of the "text"
   type are defined to have a default charset value of "ISO-8859-1" when
   received via HTTP. Data in character sets other than "ISO-8859-1" or
   its subsets must be labelled with an appropriate charset value in
   order to be consistently interpreted by the recipient.

      Note: Many current HTTP servers provide data using charsets other
      than "ISO-8859-1" without proper labelling. This situation reduces
      interoperability and is not recommended. To compensate for this,
      some HTTP user agents provide a configuration option to allow the
      user to change the default interpretation of the media type
      character set when no charset parameter is given.

3.6.2 Multipart Types

   MIME provides for a number of "multipart" types -- encapsulations of
   several entities within a single message's Entity-Body. The multipart
   types registered by IANA [15] do not have any special meaning for
   HTTP/1.0, though user agents may need to understand each type in
   order to correctly interpret the purpose of each body-part. An HTTP
   user agent should follow the same or similar behavior as a MIME user
   agent does upon receipt of a multipart type. HTTP servers should not
   assume that all HTTP clients are prepared to handle multipart types.

   All multipart types share a common syntax and must include a boundary
   parameter as part of the media type value. The message body is itself
   a protocol element and must therefore use only CRLF to represent line
   breaks between body-parts. Multipart body-parts may contain HTTP
   header fields which are significant to the meaning of that part.

3.7  Product Tokens

   Product tokens are used to allow communicating applications to
   identify themselves via a simple product token, with an optional
   slash and version designator. Most fields using product tokens also
   allow subproducts which form a significant part of the application to



Berners-Lee, et al           Informational                     [Page 20]

RFC 1945                        HTTP/1.0                        May 1996


   be listed, separated by whitespace. By convention, the products are
   listed in order of their significance for identifying the
   application.

       product         = token ["/" product-version]
       product-version = token

   Examples:

       User-Agent: CERN-LineMode/2.15 libwww/2.17b3

       Server: Apache/0.8.4

   Product tokens should be short and to the point -- use of them for
   advertizing or other non-essential information is explicitly
   forbidden. Although any token character may appear in a product-
   version, this token should only be used for a version identifier
   (i.e., successive versions of the same product should only differ in
   the product-version portion of the product value).

4.  HTTP Message

4.1  Message Types

   HTTP messages consist of requests from client to server and responses
   from server to client.

       HTTP-message   = Simple-Request           ; HTTP/0.9 messages
                      | Simple-Response
                      | Full-Request             ; HTTP/1.0 messages
                      | Full-Response

   Full-Request and Full-Response use the generic message format of RFC
   822 [7] for transferring entities. Both messages may include optional
   header fields (also known as "headers") and an entity body. The
   entity body is separated from the headers by a null line (i.e., a
   line with nothing preceding the CRLF).

       Full-Request   = Request-Line             ; Section 5.1
                        *( General-Header        ; Section 4.3
                         | Request-Header        ; Section 5.2
                         | Entity-Header )       ; Section 7.1
                        CRLF
                        [ Entity-Body ]          ; Section 7.2

       Full-Response  = Status-Line              ; Section 6.1
                        *( General-Header        ; Section 4.3
                         | Response-Header       ; Section 6.2



Berners-Lee, et al           Informational                     [Page 21]

RFC 1945                        HTTP/1.0                        May 1996


                         | Entity-Header )       ; Section 7.1
                        CRLF
                        [ Entity-Body ]          ; Section 7.2

   Simple-Request and Simple-Response do not allow the use of any header
   information and are limited to a single request method (GET).

       Simple-Request  = "GET" SP Request-URI CRLF

       Simple-Response = [ Entity-Body ]

   Use of the Simple-Request format is discouraged because it prevents
   the server from identifying the media type of the returned entity.

4.2  Message Headers

   HTTP header fields, which include General-Header (Section 4.3),
   Request-Header (Section 5.2), Response-Header (Section 6.2), and
   Entity-Header (Section 7.1) fields, follow the same generic format as
   that given in Section 3.1 of RFC 822 [7]. Each header field consists
   of a name followed immediately by a colon (":"), a single space (SP)
   character, and the field value. Field names are case-insensitive.
   Header fields can be extended over multiple lines by preceding each
   extra line with at least one SP or HT, though this is not
   recommended.

       HTTP-header    = field-name ":" [ field-value ] CRLF

       field-name     = token
       field-value    = *( field-content | LWS )

       field-content  = <the OCTETs making up the field-value
                        and consisting of either *TEXT or combinations
                        of token, tspecials, and quoted-string>

   The order in which header fields are received is not significant.
   However, it is "good practice" to send General-Header fields first,
   followed by Request-Header or Response-Header fields prior to the
   Entity-Header fields.

   Multiple HTTP-header fields with the same field-name may be present
   in a message if and only if the entire field-value for that header
   field is defined as a comma-separated list [i.e., #(values)]. It must
   be possible to combine the multiple header fields into one "field-
   name: field-value" pair, without changing the semantics of the
   message, by appending each subsequent field-value to the first, each
   separated by a comma.




Berners-Lee, et al           Informational                     [Page 22]

RFC 1945                        HTTP/1.0                        May 1996


4.3  General Header Fields

   There are a few header fields which have general applicability for
   both request and response messages, but which do not apply to the
   entity being transferred. These headers apply only to the message
   being transmitted.

       General-Header = Date                     ; Section 10.6
                      | Pragma                   ; Section 10.12

   General header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields may be given the semantics of general
   header fields if all parties in the communication recognize them to
   be general header fields. Unrecognized header fields are treated as
   Entity-Header fields.

5. Request

   A request message from a client to a server includes, within the
   first line of that message, the method to be applied to the resource,
   the identifier of the resource, and the protocol version in use. For
   backwards compatibility with the more limited HTTP/0.9 protocol,
   there are two valid formats for an HTTP request:

       Request        = Simple-Request | Full-Request

       Simple-Request = "GET" SP Request-URI CRLF

       Full-Request   = Request-Line             ; Section 5.1
                        *( General-Header        ; Section 4.3
                         | Request-Header        ; Section 5.2
                         | Entity-Header )       ; Section 7.1
                        CRLF
                        [ Entity-Body ]          ; Section 7.2

   If an HTTP/1.0 server receives a Simple-Request, it must respond with
   an HTTP/0.9 Simple-Response. An HTTP/1.0 client capable of receiving
   a Full-Response should never generate a Simple-Request.

5.1  Request-Line

   The Request-Line begins with a method token, followed by the
   Request-URI and the protocol version, and ending with CRLF. The
   elements are separated by SP characters. No CR or LF are allowed
   except in the final CRLF sequence.

       Request-Line = Method SP Request-URI SP HTTP-Version CRLF



Berners-Lee, et al           Informational                     [Page 23]

RFC 1945                        HTTP/1.0                        May 1996


   Note that the difference between a Simple-Request and the Request-
   Line of a Full-Request is the presence of the HTTP-Version field and
   the availability of methods other than GET.

5.1.1 Method

   The Method token indicates the method to be performed on the resource
   identified by the Request-URI. The method is case-sensitive.

       Method         = "GET"                    ; Section 8.1
                      | "HEAD"                   ; Section 8.2
                      | "POST"                   ; Section 8.3
                      | extension-method

       extension-method = token

   The list of methods acceptable by a specific resource can change
   dynamically; the client is notified through the return code of the
   response if a method is not allowed on a resource. Servers should
   return the status code 501 (not implemented) if the method is
   unrecognized or not implemented.

   The methods commonly used by HTTP/1.0 applications are fully defined
   in Section 8.

5.1.2 Request-URI

   The Request-URI is a Uniform Resource Identifier (Section 3.2) and
   identifies the resource upon which to apply the request.

       Request-URI    = absoluteURI | abs_path

   The two options for Request-URI are dependent on the nature of the
   request.

   The absoluteURI form is only allowed when the request is being made
   to a proxy. The proxy is requested to forward the request and return
   the response. If the request is GET or HEAD and a prior response is
   cached, the proxy may use the cached message if it passes any
   restrictions in the Expires header field. Note that the proxy may
   forward the request on to another proxy or directly to the server
   specified by the absoluteURI. In order to avoid request loops, a
   proxy must be able to recognize all of its server names, including
   any aliases, local variations, and the numeric IP address. An example
   Request-Line would be:

       GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.0




Berners-Lee, et al           Informational                     [Page 24]

RFC 1945                        HTTP/1.0                        May 1996


   The most common form of Request-URI is that used to identify a
   resource on an origin server or gateway. In this case, only the
   absolute path of the URI is transmitted (see Section 3.2.1,
   abs_path). For example, a client wishing to retrieve the resource
   above directly from the origin server would create a TCP connection
   to port 80 of the host "www.w3.org" and send the line:

       GET /pub/WWW/TheProject.html HTTP/1.0

   followed by the remainder of the Full-Request. Note that the absolute
   path cannot be empty; if none is present in the original URI, it must
   be given as "/" (the server root).

   The Request-URI is transmitted as an encoded string, where some
   characters may be escaped using the "% HEX HEX" encoding defined by
   RFC 1738 [4]. The origin server must decode the Request-URI in order
   to properly interpret the request.

5.2  Request Header Fields

   The request header fields allow the client to pass additional
   information about the request, and about the client itself, to the
   server. These fields act as request modifiers, with semantics
   equivalent to the parameters on a programming language method
   (procedure) invocation.

       Request-Header = Authorization            ; Section 10.2
                      | From                     ; Section 10.8
                      | If-Modified-Since        ; Section 10.9
                      | Referer                  ; Section 10.13
                      | User-Agent               ; Section 10.15

   Request-Header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields may be given the semantics of request
   header fields if all parties in the communication recognize them to
   be request header fields. Unrecognized header fields are treated as
   Entity-Header fields.

6.  Response

   After receiving and interpreting a request message, a server responds
   in the form of an HTTP response message.

       Response        = Simple-Response | Full-Response

       Simple-Response = [ Entity-Body ]




Berners-Lee, et al           Informational                     [Page 25]

RFC 1945                        HTTP/1.0                        May 1996


       Full-Response   = Status-Line             ; Section 6.1
                         *( General-Header       ; Section 4.3
                          | Response-Header      ; Section 6.2
                          | Entity-Header )      ; Section 7.1
                         CRLF
                         [ Entity-Body ]         ; Section 7.2

   A Simple-Response should only be sent in response to an HTTP/0.9
   Simple-Request or if the server only supports the more limited
   HTTP/0.9 protocol. If a client sends an HTTP/1.0 Full-Request and
   receives a response that does not begin with a Status-Line, it should
   assume that the response is a Simple-Response and parse it
   accordingly. Note that the Simple-Response consists only of the
   entity body and is terminated by the server closing the connection.

6.1  Status-Line

   The first line of a Full-Response message is the Status-Line,
   consisting of the protocol version followed by a numeric status code
   and its associated textual phrase, with each element separated by SP
   characters. No CR or LF is allowed except in the final CRLF sequence.

       Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

   Since a status line always begins with the protocol version and
   status code

       "HTTP/" 1*DIGIT "." 1*DIGIT SP 3DIGIT SP

   (e.g., "HTTP/1.0 200 "), the presence of that expression is
   sufficient to differentiate a Full-Response from a Simple-Response.
   Although the Simple-Response format may allow such an expression to
   occur at the beginning of an entity body, and thus cause a
   misinterpretation of the message if it was given in response to a
   Full-Request, most HTTP/0.9 servers are limited to responses of type
   "text/html" and therefore would never generate such a response.

6.1.1 Status Code and Reason Phrase

   The Status-Code element is a 3-digit integer result code of the
   attempt to understand and satisfy the request. The Reason-Phrase is
   intended to give a short textual description of the Status-Code. The
   Status-Code is intended for use by automata and the Reason-Phrase is
   intended for the human user. The client is not required to examine or
   display the Reason-Phrase.






Berners-Lee, et al           Informational                     [Page 26]

RFC 1945                        HTTP/1.0                        May 1996


   The first digit of the Status-Code defines the class of response. The
   last two digits do not have any categorization role. There are 5
   values for the first digit:

      o 1xx: Informational - Not used, but reserved for future use

      o 2xx: Success - The action was successfully received,
             understood, and accepted.

      o 3xx: Redirection - Further action must be taken in order to
             complete the request

      o 4xx: Client Error - The request contains bad syntax or cannot
             be fulfilled

      o 5xx: Server Error - The server failed to fulfill an apparently
             valid request

   The individual values of the numeric status codes defined for
   HTTP/1.0, and an example set of corresponding Reason-Phrase's, are
   presented below. The reason phrases listed here are only recommended
   -- they may be replaced by local equivalents without affecting the
   protocol. These codes are fully defined in Section 9.

       Status-Code    = "200"   ; OK
                      | "201"   ; Created
                      | "202"   ; Accepted
                      | "204"   ; No Content
                      | "301"   ; Moved Permanently
                      | "302"   ; Moved Temporarily
                      | "304"   ; Not Modified
                      | "400"   ; Bad Request
                      | "401"   ; Unauthorized
                      | "403"   ; Forbidden
                      | "404"   ; Not Found
                      | "500"   ; Internal Server Error
                      | "501"   ; Not Implemented
                      | "502"   ; Bad Gateway
                      | "503"   ; Service Unavailable
                      | extension-code

       extension-code = 3DIGIT

       Reason-Phrase  = *<TEXT, excluding CR, LF>

   HTTP status codes are extensible, but the above codes are the only
   ones generally recognized in current practice. HTTP applications are
   not required to understand the meaning of all registered status



Berners-Lee, et al           Informational                     [Page 27]

RFC 1945                        HTTP/1.0                        May 1996


   codes, though such understanding is obviously desirable. However,
   applications must understand the class of any status code, as
   indicated by the first digit, and treat any unrecognized response as
   being equivalent to the x00 status code of that class, with the
   exception that an unrecognized response must not be cached. For
   example, if an unrecognized status code of 431 is received by the
   client, it can safely assume that there was something wrong with its
   request and treat the response as if it had received a 400 status
   code. In such cases, user agents should present to the user the
   entity returned with the response, since that entity is likely to
   include human-readable information which will explain the unusual
   status.

6.2  Response Header Fields

   The response header fields allow the server to pass additional
   information about the response which cannot be placed in the Status-
   Line. These header fields give information about the server and about
   further access to the resource identified by the Request-URI.

       Response-Header = Location                ; Section 10.11
                       | Server                  ; Section 10.14
                       | WWW-Authenticate        ; Section 10.16

   Response-Header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields may be given the semantics of response
   header fields if all parties in the communication recognize them to
    be response header fields. Unrecognized header fields are treated as
   Entity-Header fields.

7.  Entity

   Full-Request and Full-Response messages may transfer an entity within
   some requests and responses. An entity consists of Entity-Header
   fields and (usually) an Entity-Body. In this section, both sender and
   recipient refer to either the client or the server, depending on who
   sends and who receives the entity.













Berners-Lee, et al           Informational                     [Page 28]

RFC 1945                        HTTP/1.0                        May 1996


7.1  Entity Header Fields

   Entity-Header fields define optional metainformation about the
   Entity-Body or, if no body is present, about the resource identified
   by the request.

       Entity-Header  = Allow                    ; Section 10.1
                      | Content-Encoding         ; Section 10.3
                      | Content-Length           ; Section 10.4
                      | Content-Type             ; Section 10.5
                      | Expires                  ; Section 10.7
                      | Last-Modified            ; Section 10.10
                      | extension-header

       extension-header = HTTP-header

   The extension-header mechanism allows additional Entity-Header fields
   to be defined without changing the protocol, but these fields cannot
   be assumed to be recognizable by the recipient. Unrecognized header
   fields should be ignored by the recipient and forwarded by proxies.

7.2  Entity Body

   The entity body (if any) sent with an HTTP request or response is in
   a format and encoding defined by the Entity-Header fields.

       Entity-Body    = *OCTET

   An entity body is included with a request message only when the
   request method calls for one. The presence of an entity body in a
   request is signaled by the inclusion of a Content-Length header field
   in the request message headers. HTTP/1.0 requests containing an
   entity body must include a valid Content-Length header field.

   For response messages, whether or not an entity body is included with
   a message is dependent on both the request method and the response
   code. All responses to the HEAD request method must not include a
   body, even though the presence of entity header fields may lead one
   to believe they do. All 1xx (informational), 204 (no content), and
   304 (not modified) responses must not include a body. All other
   responses must include an entity body or a Content-Length header
   field defined with a value of zero (0).

7.2.1 Type

   When an Entity-Body is included with a message, the data type of that
   body is determined via the header fields Content-Type and Content-
   Encoding. These define a two-layer, ordered encoding model:



Berners-Lee, et al           Informational                     [Page 29]

RFC 1945                        HTTP/1.0                        May 1996


       entity-body := Content-Encoding( Content-Type( data ) )

   A Content-Type specifies the media type of the underlying data. A
   Content-Encoding may be used to indicate any additional content
   coding applied to the type, usually for the purpose of data
   compression, that is a property of the resource requested. The
   default for the content encoding is none (i.e., the identity
   function).

   Any HTTP/1.0 message containing an entity body should include a
   Content-Type header field defining the media type of that body. If
   and only if the media type is not given by a Content-Type header, as
   is the case for Simple-Response messages, the recipient may attempt
   to guess the media type via inspection of its content and/or the name
   extension(s) of the URL used to identify the resource. If the media
   type remains unknown, the recipient should treat it as type
   "application/octet-stream".

7.2.2 Length

   When an Entity-Body is included with a message, the length of that
   body may be determined in one of two ways. If a Content-Length header
   field is present, its value in bytes represents the length of the
   Entity-Body. Otherwise, the body length is determined by the closing
   of the connection by the server.

   Closing the connection cannot be used to indicate the end of a
   request body, since it leaves no possibility for the server to send
   back a response. Therefore, HTTP/1.0 requests containing an entity
   body must include a valid Content-Length header field. If a request
   contains an entity body and Content-Length is not specified, and the
   server does not recognize or cannot calculate the length from other
   fields, then the server should send a 400 (bad request) response.

      Note: Some older servers supply an invalid Content-Length when
      sending a document that contains server-side includes dynamically
      inserted into the data stream. It must be emphasized that this
      will not be tolerated by future versions of HTTP. Unless the
      client knows that it is receiving a response from a compliant
      server, it should not depend on the Content-Length value being
      correct.

8.  Method Definitions

   The set of common methods for HTTP/1.0 is defined below. Although
   this set can be expanded, additional methods cannot be assumed to
   share the same semantics for separately extended clients and servers.




Berners-Lee, et al           Informational                     [Page 30]

RFC 1945                        HTTP/1.0                        May 1996


8.1  GET

   The GET method means retrieve whatever information (in the form of an
   entity) is identified by the Request-URI. If the Request-URI refers
   to a data-producing process, it is the produced data which shall be
   returned as the entity in the response and not the source text of the
   process, unless that text happens to be the output of the process.

   The semantics of the GET method changes to a "conditional GET" if the
   request message includes an If-Modified-Since header field. A
   conditional GET method requests that the identified resource be
   transferred only if it has been modified since the date given by the
   If-Modified-Since header, as described in Section 10.9. The
   conditional GET method is intended to reduce network usage by
   allowing cached entities to be refreshed without requiring multiple
   requests or transferring unnecessary data.

8.2  HEAD

   The HEAD method is identical to GET except that the server must not
   return any Entity-Body in the response. The metainformation contained
   in the HTTP headers in response to a HEAD request should be identical
   to the information sent in response to a GET request. This method can
   be used for obtaining metainformation about the resource identified
   by the Request-URI without transferring the Entity-Body itself. This
   method is often used for testing hypertext links for validity,
   accessibility, and recent modification.

   There is no "conditional HEAD" request analogous to the conditional
   GET. If an If-Modified-Since header field is included with a HEAD
   request, it should be ignored.

8.3  POST

   The POST method is used to request that the destination server accept
   the entity enclosed in the request as a new subordinate of the
   resource identified by the Request-URI in the Request-Line. POST is
   designed to allow a uniform method to cover the following functions:

      o Annotation of existing resources;

      o Posting a message to a bulletin board, newsgroup, mailing list,
        or similar group of articles;

      o Providing a block of data, such as the result of submitting a
        form [3], to a data-handling process;

      o Extending a database through an append operation.



Berners-Lee, et al           Informational                     [Page 31]

RFC 1945                        HTTP/1.0                        May 1996


   The actual function performed by the POST method is determined by the
   server and is usually dependent on the Request-URI. The posted entity
   is subordinate to that URI in the same way that a file is subordinate
   to a directory containing it, a news article is subordinate to a
   newsgroup to which it is posted, or a record is subordinate to a
   database.

   A successful POST does not require that the entity be created as a
   resource on the origin server or made accessible for future
   reference. That is, the action performed by the POST method might not
   result in a resource that can be identified by a URI. In this case,
   either 200 (ok) or 204 (no content) is the appropriate response
   status, depending on whether or not the response includes an entity
   that describes the result.

   If a resource has been created on the origin server, the response
   should be 201 (created) and contain an entity (preferably of type
   "text/html") which describes the status of the request and refers to
   the new resource.

   A valid Content-Length is required on all HTTP/1.0 POST requests. An
   HTTP/1.0 server should respond with a 400 (bad request) message if it
   cannot determine the length of the request message's content.

   Applications must not cache responses to a POST request because the
   application has no way of knowing that the server would return an
   equivalent response on some future request.

9.  Status Code Definitions

   Each Status-Code is described below, including a description of which
   method(s) it can follow and any metainformation required in the
   response.

9.1  Informational 1xx

   This class of status code indicates a provisional response,
   consisting only of the Status-Line and optional headers, and is
   terminated by an empty line. HTTP/1.0 does not define any 1xx status
   codes and they are not a valid response to a HTTP/1.0 request.
   However, they may be useful for experimental applications which are
   outside the scope of this specification.

9.2  Successful 2xx

   This class of status code indicates that the client's request was
   successfully received, understood, and accepted.




Berners-Lee, et al           Informational                     [Page 32]

RFC 1945                        HTTP/1.0                        May 1996


   200 OK

   The request has succeeded. The information returned with the
   response is dependent on the method used in the request, as follows:

   GET    an entity corresponding to the requested resource is sent
          in the response;

   HEAD   the response must only contain the header information and
          no Entity-Body;

   POST   an entity describing or containing the result of the action.

   201 Created

   The request has been fulfilled and resulted in a new resource being
   created. The newly created resource can be referenced by the URI(s)
   returned in the entity of the response. The origin server should
   create the resource before using this Status-Code. If the action
   cannot be carried out immediately, the server must include in the
   response body a description of when the resource will be available;
   otherwise, the server should respond with 202 (accepted).

   Of the methods defined by this specification, only POST can create a
   resource.

   202 Accepted

   The request has been accepted for processing, but the processing
   has not been completed. The request may or may not eventually be
   acted upon, as it may be disallowed when processing actually takes
   place. There is no facility for re-sending a status code from an
   asynchronous operation such as this.

   The 202 response is intentionally non-committal. Its purpose is to
   allow a server to accept a request for some other process (perhaps
   a batch-oriented process that is only run once per day) without
   requiring that the user agent's connection to the server persist
   until the process is completed. The entity returned with this
   response should include an indication of the request's current
   status and either a pointer to a status monitor or some estimate of
   when the user can expect the request to be fulfilled.

   204 No Content

   The server has fulfilled the request but there is no new
   information to send back. If the client is a user agent, it should
   not change its document view from that which caused the request to



Berners-Lee, et al           Informational                     [Page 33]

RFC 1945                        HTTP/1.0                        May 1996


   be generated. This response is primarily intended to allow input
   for scripts or other actions to take place without causing a change
   to the user agent's active document view. The response may include
   new metainformation in the form of entity headers, which should
   apply to the document currently in the user agent's active view.

9.3  Redirection 3xx

   This class of status code indicates that further action needs to be
   taken by the user agent in order to fulfill the request. The action
   required may be carried out by the user agent without interaction
   with the user if and only if the method used in the subsequent
   request is GET or HEAD. A user agent should never automatically
   redirect a request more than 5 times, since such redirections usually
   indicate an infinite loop.

   300 Multiple Choices

   This response code is not directly used by HTTP/1.0 applications,
   but serves as the default for interpreting the 3xx class of
   responses.

   The requested resource is available at one or more locations.
   Unless it was a HEAD request, the response should include an entity
   containing a list of resource characteristics and locations from
   which the user or user agent can choose the one most appropriate.
   If the server has a preferred choice, it should include the URL in
   a Location field; user agents may use this field value for
   automatic redirection.

   301 Moved Permanently

   The requested resource has been assigned a new permanent URL and
   any future references to this resource should be done using that
   URL. Clients with link editing capabilities should automatically
   relink references to the Request-URI to the new reference returned
   by the server, where possible.

   The new URL must be given by the Location field in the response.
   Unless it was a HEAD request, the Entity-Body of the response
   should contain a short note with a hyperlink to the new URL.

   If the 301 status code is received in response to a request using
   the POST method, the user agent must not automatically redirect the
   request unless it can be confirmed by the user, since this might
   change the conditions under which the request was issued.





Berners-Lee, et al           Informational                     [Page 34]

RFC 1945                        HTTP/1.0                        May 1996


       Note: When automatically redirecting a POST request after
       receiving a 301 status code, some existing user agents will
       erroneously change it into a GET request.

   302 Moved Temporarily

   The requested resource resides temporarily under a different URL.
   Since the redirection may be altered on occasion, the client should
   continue to use the Request-URI for future requests.

   The URL must be given by the Location field in the response. Unless
   it was a HEAD request, the Entity-Body of the response should
   contain a short note with a hyperlink to the new URI(s).

   If the 302 status code is received in response to a request using
   the POST method, the user agent must not automatically redirect the
   request unless it can be confirmed by the user, since this might
   change the conditions under which the request was issued.

       Note: When automatically redirecting a POST request after
       receiving a 302 status code, some existing user agents will
       erroneously change it into a GET request.

   304 Not Modified

   If the client has performed a conditional GET request and access is
   allowed, but the document has not been modified since the date and
   time specified in the If-Modified-Since field, the server must
   respond with this status code and not send an Entity-Body to the
   client. Header fields contained in the response should only include
   information which is relevant to cache managers or which may have
   changed independently of the entity's Last-Modified date. Examples
   of relevant header fields include: Date, Server, and Expires. A
   cache should update its cached entity to reflect any new field
   values given in the 304 response.

9.4  Client Error 4xx

   The 4xx class of status code is intended for cases in which the
   client seems to have erred. If the client has not completed the
   request when a 4xx code is received, it should immediately cease
   sending data to the server. Except when responding to a HEAD request,
   the server should include an entity containing an explanation of the
   error situation, and whether it is a temporary or permanent
   condition. These status codes are applicable to any request method.






Berners-Lee, et al           Informational                     [Page 35]

RFC 1945                        HTTP/1.0                        May 1996


      Note: If the client is sending data, server implementations on TCP
      should be careful to ensure that the client acknowledges receipt
      of the packet(s) containing the response prior to closing the
      input connection. If the client continues sending data to the
      server after the close, the server's controller will send a reset
      packet to the client, which may erase the client's unacknowledged
      input buffers before they can be read and interpreted by the HTTP
      application.

   400 Bad Request

   The request could not be understood by the server due to malformed
   syntax. The client should not repeat the request without
   modifications.

   401 Unauthorized

   The request requires user authentication. The response must include
   a WWW-Authenticate header field (Section 10.16) containing a
   challenge applicable to the requested resource. The client may
   repeat the request with a suitable Authorization header field
   (Section 10.2). If the request already included Authorization
   credentials, then the 401 response indicates that authorization has
   been refused for those credentials. If the 401 response contains
   the same challenge as the prior response, and the user agent has
   already attempted authentication at least once, then the user
   should be presented the entity that was given in the response,
   since that entity may include relevant diagnostic information. HTTP
   access authentication is explained in Section 11.

   403 Forbidden

   The server understood the request, but is refusing to fulfill it.
   Authorization will not help and the request should not be repeated.
   If the request method was not HEAD and the server wishes to make
   public why the request has not been fulfilled, it should describe
   the reason for the refusal in the entity body. This status code is
   commonly used when the server does not wish to reveal exactly why
   the request has been refused, or when no other response is
   applicable.

   404 Not Found

   The server has not found anything matching the Request-URI. No
   indication is given of whether the condition is temporary or
   permanent. If the server does not wish to make this information
   available to the client, the status code 403 (forbidden) can be
   used instead.



Berners-Lee, et al           Informational                     [Page 36]

RFC 1945                        HTTP/1.0                        May 1996


9.5  Server Error 5xx

   Response status codes beginning with the digit "5" indicate cases in
   which the server is aware that it has erred or is incapable of
   performing the request. If the client has not completed the request
   when a 5xx code is received, it should immediately cease sending data
   to the server. Except when responding to a HEAD request, the server
   should include an entity containing an explanation of the error
   situation, and whether it is a temporary or permanent condition.
   These response codes are applicable to any request method and there
   are no required header fields.

   500 Internal Server Error

   The server encountered an unexpected condition which prevented it
   from fulfilling the request.

   501 Not Implemented

   The server does not support the functionality required to fulfill
   the request. This is the appropriate response when the server does
   not recognize the request method and is not capable of supporting
   it for any resource.

   502 Bad Gateway

   The server, while acting as a gateway or proxy, received an invalid
   response from the upstream server it accessed in attempting to
   fulfill the request.

   503 Service Unavailable

   The server is currently unable to handle the request due to a
   temporary overloading or maintenance of the server. The implication
   is that this is a temporary condition which will be alleviated
   after some delay.

       Note: The existence of the 503 status code does not imply
       that a server must use it when becoming overloaded. Some
       servers may wish to simply refuse the connection.

10.  Header Field Definitions

   This section defines the syntax and semantics of all commonly used
   HTTP/1.0 header fields. For general and entity header fields, both
   sender and recipient refer to either the client or the server,
   depending on who sends and who receives the message.




Berners-Lee, et al           Informational                     [Page 37]

RFC 1945                        HTTP/1.0                        May 1996


10.1  Allow

   The Allow entity-header field lists the set of methods supported by
   the resource identified by the Request-URI. The purpose of this field
   is strictly to inform the recipient of valid methods associated with
   the resource. The Allow header field is not permitted in a request
   using the POST method, and thus should be ignored if it is received
   as part of a POST entity.

       Allow          = "Allow" ":" 1#method

    Example of use:

       Allow: GET, HEAD

   This field cannot prevent a client from trying other methods.
   However, the indications given by the Allow header field value should
   be followed. The actual set of allowed methods is defined by the
   origin server at the time of each request.

   A proxy must not modify the Allow header field even if it does not
   understand all the methods specified, since the user agent may have
   other means of communicating with the origin server.

   The Allow header field does not indicate what methods are implemented
   by the server.

10.2  Authorization

   A user agent that wishes to authenticate itself with a server--
   usually, but not necessarily, after receiving a 401 response--may do
   so by including an Authorization request-header field with the
   request. The Authorization field value consists of credentials
   containing the authentication information of the user agent for the
   realm of the resource being requested.

       Authorization  = "Authorization" ":" credentials

   HTTP access authentication is described in Section 11. If a request
   is authenticated and a realm specified, the same credentials should
   be valid for all other requests within this realm.

   Responses to requests containing an Authorization field are not
   cachable.







Berners-Lee, et al           Informational                     [Page 38]

RFC 1945                        HTTP/1.0                        May 1996


10.3  Content-Encoding

   The Content-Encoding entity-header field is used as a modifier to the
   media-type. When present, its value indicates what additional content
   coding has been applied to the resource, and thus what decoding
   mechanism must be applied in order to obtain the media-type
   referenced by the Content-Type header field. The Content-Encoding is
   primarily used to allow a document to be compressed without losing
   the identity of its underlying media type.

       Content-Encoding = "Content-Encoding" ":" content-coding

   Content codings are defined in Section 3.5. An example of its use is

       Content-Encoding: x-gzip

   The Content-Encoding is a characteristic of the resource identified
   by the Request-URI. Typically, the resource is stored with this
   encoding and is only decoded before rendering or analogous usage.

10.4  Content-Length

   The Content-Length entity-header field indicates the size of the
   Entity-Body, in decimal number of octets, sent to the recipient or,
   in the case of the HEAD method, the size of the Entity-Body that
   would have been sent had the request been a GET.

       Content-Length = "Content-Length" ":" 1*DIGIT

   An example is

       Content-Length: 3495

   Applications should use this field to indicate the size of the
   Entity-Body to be transferred, regardless of the media type of the
   entity. A valid Content-Length field value is required on all
   HTTP/1.0 request messages containing an entity body.

   Any Content-Length greater than or equal to zero is a valid value.
   Section 7.2.2 describes how to determine the length of a response
   entity body if a Content-Length is not given.

      Note: The meaning of this field is significantly different from
      the corresponding definition in MIME, where it is an optional
      field used within the "message/external-body" content-type. In
      HTTP, it should be used whenever the entity's length can be
      determined prior to being transferred.




Berners-Lee, et al           Informational                     [Page 39]

RFC 1945                        HTTP/1.0                        May 1996


10.5  Content-Type

   The Content-Type entity-header field indicates the media type of the
   Entity-Body sent to the recipient or, in the case of the HEAD method,
   the media type that would have been sent had the request been a GET.

       Content-Type   = "Content-Type" ":" media-type

   Media types are defined in Section 3.6. An example of the field is

       Content-Type: text/html

   Further discussion of methods for identifying the media type of an
   entity is provided in Section 7.2.1.

10.6  Date

   The Date general-header field represents the date and time at which
   the message was originated, having the same semantics as orig-date in
   RFC 822. The field value is an HTTP-date, as described in Section
   3.3.

       Date           = "Date" ":" HTTP-date

   An example is

       Date: Tue, 15 Nov 1994 08:12:31 GMT

   If a message is received via direct connection with the user agent
   (in the case of requests) or the origin server (in the case of
   responses), then the date can be assumed to be the current date at
   the receiving end. However, since the date--as it is believed by the
   origin--is important for evaluating cached responses, origin servers
   should always include a Date header. Clients should only send a Date
   header field in messages that include an entity body, as in the case
   of the POST request, and even then it is optional. A received message
   which does not have a Date header field should be assigned one by the
   recipient if the message will be cached by that recipient or
   gatewayed via a protocol which requires a Date.

   In theory, the date should represent the moment just before the
   entity is generated. In practice, the date can be generated at any
   time during the message origination without affecting its semantic
   value.

      Note: An earlier version of this document incorrectly specified
      that this field should contain the creation date of the enclosed
      Entity-Body. This has been changed to reflect actual (and proper)



Berners-Lee, et al           Informational                     [Page 40]

RFC 1945                        HTTP/1.0                        May 1996


      usage.

10.7  Expires

   The Expires entity-header field gives the date/time after which the
   entity should be considered stale. This allows information providers
   to suggest the volatility of the resource, or a date after which the
   information may no longer be valid. Applications must not cache this
   entity beyond the date given. The presence of an Expires field does
   not imply that the original resource will change or cease to exist
   at, before, or after that time. However, information providers that
   know or even suspect that a resource will change by a certain date
   should include an Expires header with that date. The format is an
   absolute date and time as defined by HTTP-date in Section 3.3.

       Expires        = "Expires" ":" HTTP-date

   An example of its use is

       Expires: Thu, 01 Dec 1994 16:00:00 GMT

   If the date given is equal to or earlier than the value of the Date
   header, the recipient must not cache the enclosed entity. If a
   resource is dynamic by nature, as is the case with many data-
   producing processes, entities from that resource should be given an
   appropriate Expires value which reflects that dynamism.

   The Expires field cannot be used to force a user agent to refresh its
   display or reload a resource; its semantics apply only to caching
   mechanisms, and such mechanisms need only check a resource's
   expiration status when a new request for that resource is initiated.

   User agents often have history mechanisms, such as "Back" buttons and
   history lists, which can be used to redisplay an entity retrieved
   earlier in a session. By default, the Expires field does not apply to
   history mechanisms. If the entity is still in storage, a history
   mechanism should display it even if the entity has expired, unless
   the user has specifically configured the agent to refresh expired
   history documents.

      Note: Applications are encouraged to be tolerant of bad or
      misinformed implementations of the Expires header. A value of zero
      (0) or an invalid date format should be considered equivalent to
      an "expires immediately." Although these values are not legitimate
      for HTTP/1.0, a robust implementation is always desirable.






Berners-Lee, et al           Informational                     [Page 41]

RFC 1945                        HTTP/1.0                        May 1996


10.8  From

   The From request-header field, if given, should contain an Internet
   e-mail address for the human user who controls the requesting user
   agent. The address should be machine-usable, as defined by mailbox in
   RFC 822 [7] (as updated by RFC 1123 [6]):

       From           = "From" ":" mailbox

   An example is:

       From: webmaster@w3.org

   This header field may be used for logging purposes and as a means for
   identifying the source of invalid or unwanted requests. It should not
   be used as an insecure form of access protection. The interpretation
   of this field is that the request is being performed on behalf of the
   person given, who accepts responsibility for the method performed. In
   particular, robot agents should include this header so that the
   person responsible for running the robot can be contacted if problems
   occur on the receiving end.

   The Internet e-mail address in this field may be separate from the
   Internet host which issued the request. For example, when a request
   is passed through a proxy, the original issuer's address should be
   used.

      Note: The client should not send the From header field without the
      user's approval, as it may conflict with the user's privacy
      interests or their site's security policy. It is strongly
      recommended that the user be able to disable, enable, and modify
      the value of this field at any time prior to a request.

10.9  If-Modified-Since

   The If-Modified-Since request-header field is used with the GET
   method to make it conditional: if the requested resource has not been
   modified since the time specified in this field, a copy of the
   resource will not be returned from the server; instead, a 304 (not
   modified) response will be returned without any Entity-Body.

       If-Modified-Since = "If-Modified-Since" ":" HTTP-date

   An example of the field is:

       If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT





Berners-Lee, et al           Informational                     [Page 42]

RFC 1945                        HTTP/1.0                        May 1996


   A conditional GET method requests that the identified resource be
   transferred only if it has been modified since the date given by the
   If-Modified-Since header. The algorithm for determining this includes
   the following cases:

      a) If the request would normally result in anything other than
         a 200 (ok) status, or if the passed If-Modified-Since date
         is invalid, the response is exactly the same as for a
         normal GET. A date which is later than the server's current
         time is invalid.

      b) If the resource has been modified since the
         If-Modified-Since date, the response is exactly the same as
         for a normal GET.

      c) If the resource has not been modified since a valid
         If-Modified-Since date, the server shall return a 304 (not
         modified) response.

   The purpose of this feature is to allow efficient updates of cached
   information with a minimum amount of transaction overhead.

10.10  Last-Modified

   The Last-Modified entity-header field indicates the date and time at
   which the sender believes the resource was last modified. The exact
   semantics of this field are defined in terms of how the recipient
   should interpret it:  if the recipient has a copy of this resource
   which is older than the date given by the Last-Modified field, that
   copy should be considered stale.

       Last-Modified  = "Last-Modified" ":" HTTP-date

   An example of its use is

       Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

   The exact meaning of this header field depends on the implementation
   of the sender and the nature of the original resource. For files, it
   may be just the file system last-modified time. For entities with
   dynamically included parts, it may be the most recent of the set of
   last-modify times for its component parts. For database gateways, it
   may be the last-update timestamp of the record. For virtual objects,
   it may be the last time the internal state changed.

   An origin server must not send a Last-Modified date which is later
   than the server's time of message origination. In such cases, where
   the resource's last modification would indicate some time in the



Berners-Lee, et al           Informational                     [Page 43]

RFC 1945                        HTTP/1.0                        May 1996


   future, the server must replace that date with the message
   origination date.

10.11  Location

   The Location response-header field defines the exact location of the
   resource that was identified by the Request-URI. For 3xx responses,
   the location must indicate the server's preferred URL for automatic
   redirection to the resource. Only one absolute URL is allowed.

       Location       = "Location" ":" absoluteURI

   An example is

       Location: http://www.w3.org/hypertext/WWW/NewLocation.html

10.12  Pragma

   The Pragma general-header field is used to include implementation-
   specific directives that may apply to any recipient along the
   request/response chain. All pragma directives specify optional
   behavior from the viewpoint of the protocol; however, some systems
   may require that behavior be consistent with the directives.

       Pragma           = "Pragma" ":" 1#pragma-directive

       pragma-directive = "no-cache" | extension-pragma
       extension-pragma = token [ "=" word ]

   When the "no-cache" directive is present in a request message, an
   application should forward the request toward the origin server even
   if it has a cached copy of what is being requested. This allows a
   client to insist upon receiving an authoritative response to its
   request. It also allows a client to refresh a cached copy which is
   known to be corrupted or stale.

   Pragma directives must be passed through by a proxy or gateway
   application, regardless of their significance to that application,
   since the directives may be applicable to all recipients along the
   request/response chain. It is not possible to specify a pragma for a
   specific recipient; however, any pragma directive not relevant to a
   recipient should be ignored by that recipient.

10.13  Referer

   The Referer request-header field allows the client to specify, for
   the server's benefit, the address (URI) of the resource from which
   the Request-URI was obtained. This allows a server to generate lists



Berners-Lee, et al           Informational                     [Page 44]

RFC 1945                        HTTP/1.0                        May 1996


   of back-links to resources for interest, logging, optimized caching,
   etc. It also allows obsolete or mistyped links to be traced for
   maintenance. The Referer field must not be sent if the Request-URI
   was obtained from a source that does not have its own URI, such as
   input from the user keyboard.

       Referer        = "Referer" ":" ( absoluteURI | relativeURI )

   Example:

       Referer: http://www.w3.org/hypertext/DataSources/Overview.html

   If a partial URI is given, it should be interpreted relative to the
   Request-URI. The URI must not include a fragment.

      Note: Because the source of a link may be private information or
      may reveal an otherwise private information source, it is strongly
      recommended that the user be able to select whether or not the
      Referer field is sent. For example, a browser client could have a
      toggle switch for browsing openly/anonymously, which would
      respectively enable/disable the sending of Referer and From
      information.

10.14  Server

   The Server response-header field contains information about the
   software used by the origin server to handle the request. The field
   can contain multiple product tokens (Section 3.7) and comments
   identifying the server and any significant subproducts. By
   convention, the product tokens are listed in order of their
   significance for identifying the application.

       Server         = "Server" ":" 1*( product | comment )

   Example:

       Server: CERN/3.0 libwww/2.17

   If the response is being forwarded through a proxy, the proxy
   application must not add its data to the product list.

      Note: Revealing the specific software version of the server may
      allow the server machine to become more vulnerable to attacks
      against software that is known to contain security holes. Server
      implementors are encouraged to make this field a configurable
      option.





Berners-Lee, et al           Informational                     [Page 45]

RFC 1945                        HTTP/1.0                        May 1996


      Note: Some existing servers fail to restrict themselves to the
      product token syntax within the Server field.

10.15  User-Agent

   The User-Agent request-header field contains information about the
   user agent originating the request. This is for statistical purposes,
   the tracing of protocol violations, and automated recognition of user
   agents for the sake of tailoring responses to avoid particular user
   agent limitations. Although it is not required, user agents should
   include this field with requests. The field can contain multiple
   product tokens (Section 3.7) and comments identifying the agent and
   any subproducts which form a significant part of the user agent. By
   convention, the product tokens are listed in order of their
   significance for identifying the application.

       User-Agent     = "User-Agent" ":" 1*( product | comment )

   Example:

       User-Agent: CERN-LineMode/2.15 libwww/2.17b3

       Note: Some current proxy applications append their product
       information to the list in the User-Agent field. This is not
       recommended, since it makes machine interpretation of these
       fields ambiguous.

       Note: Some existing clients fail to restrict themselves to
       the product token syntax within the User-Agent field.

10.16  WWW-Authenticate

   The WWW-Authenticate response-header field must be included in 401
   (unauthorized) response messages. The field value consists of at
   least one challenge that indicates the authentication scheme(s) and
   parameters applicable to the Request-URI.

       WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge

   The HTTP access authentication process is described in Section 11.
   User agents must take special care in parsing the WWW-Authenticate
   field value if it contains more than one challenge, or if more than
   one WWW-Authenticate header field is provided, since the contents of
   a challenge may itself contain a comma-separated list of
   authentication parameters.






Berners-Lee, et al           Informational                     [Page 46]

RFC 1945                        HTTP/1.0                        May 1996


11.  Access Authentication

   HTTP provides a simple challenge-response authentication mechanism
   which may be used by a server to challenge a client request and by a
   client to provide authentication information. It uses an extensible,
   case-insensitive token to identify the authentication scheme,
   followed by a comma-separated list of attribute-value pairs which
   carry the parameters necessary for achieving authentication via that
   scheme.

       auth-scheme    = token

       auth-param     = token "=" quoted-string

   The 401 (unauthorized) response message is used by an origin server
   to challenge the authorization of a user agent. This response must
   include a WWW-Authenticate header field containing at least one
   challenge applicable to the requested resource.

       challenge      = auth-scheme 1*SP realm *( "," auth-param )

       realm          = "realm" "=" realm-value
       realm-value    = quoted-string

   The realm attribute (case-insensitive) is required for all
   authentication schemes which issue a challenge. The realm value
   (case-sensitive), in combination with the canonical root URL of the
   server being accessed, defines the protection space. These realms
   allow the protected resources on a server to be partitioned into a
   set of protection spaces, each with its own authentication scheme
   and/or authorization database. The realm value is a string, generally
   assigned by the origin server, which may have additional semantics
   specific to the authentication scheme.

   A user agent that wishes to authenticate itself with a server--
   usually, but not necessarily, after receiving a 401 response--may do
   so by including an Authorization header field with the request. The
   Authorization field value consists of credentials containing the
   authentication information of the user agent for the realm of the
   resource being requested.

       credentials    = basic-credentials
                      | ( auth-scheme #auth-param )

   The domain over which credentials can be automatically applied by a
   user agent is determined by the protection space. If a prior request
   has been authorized, the same credentials may be reused for all other
   requests within that protection space for a period of time determined



Berners-Lee, et al           Informational                     [Page 47]

RFC 1945                        HTTP/1.0                        May 1996


   by the authentication scheme, parameters, and/or user preference.
   Unless otherwise defined by the authentication scheme, a single
   protection space cannot extend outside the scope of its server.

   If the server does not wish to accept the credentials sent with a
   request, it should return a 403 (forbidden) response.

   The HTTP protocol does not restrict applications to this simple
   challenge-response mechanism for access authentication. Additional
   mechanisms may be used, such as encryption at the transport level or
   via message encapsulation, and with additional header fields
   specifying authentication information. However, these additional
   mechanisms are not defined by this specification.

   Proxies must be completely transparent regarding user agent
   authentication. That is, they must forward the WWW-Authenticate and
   Authorization headers untouched, and must not cache the response to a
   request containing Authorization. HTTP/1.0 does not provide a means
   for a client to be authenticated with a proxy.

11.1  Basic Authentication Scheme

   The "basic" authentication scheme is based on the model that the user
   agent must authenticate itself with a user-ID and a password for each
   realm. The realm value should be considered an opaque string which
   can only be compared for equality with other realms on that server.
   The server will authorize the request only if it can validate the
   user-ID and password for the protection space of the Request-URI.
   There are no optional authentication parameters.

   Upon receipt of an unauthorized request for a URI within the
   protection space, the server should respond with a challenge like the
   following:

       WWW-Authenticate: Basic realm="WallyWorld"

   where "WallyWorld" is the string assigned by the server to identify
   the protection space of the Request-URI.

   To receive authorization, the client sends the user-ID and password,
   separated by a single colon (":") character, within a base64 [5]
   encoded string in the credentials.

       basic-credentials = "Basic" SP basic-cookie

       basic-cookie      = <base64 [5] encoding of userid-password,
                            except not limited to 76 char/line>




Berners-Lee, et al           Informational                     [Page 48]

RFC 1945                        HTTP/1.0                        May 1996


       userid-password   = [ token ] ":" *TEXT

   If the user agent wishes to send the user-ID "Aladdin" and password
   "open sesame", it would use the following header field:

       Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

   The basic authentication scheme is a non-secure method of filtering
   unauthorized access to resources on an HTTP server. It is based on
   the assumption that the connection between the client and the server
   can be regarded as a trusted carrier. As this is not generally true
   on an open network, the basic authentication scheme should be used
   accordingly. In spite of this, clients should implement the scheme in
   order to communicate with servers that use it.

12.  Security Considerations

   This section is meant to inform application developers, information
   providers, and users of the security limitations in HTTP/1.0 as
   described by this document. The discussion does not include
   definitive solutions to the problems revealed, though it does make
   some suggestions for reducing security risks.

12.1  Authentication of Clients

   As mentioned in Section 11.1, the Basic authentication scheme is not
   a secure method of user authentication, nor does it prevent the
   Entity-Body from being transmitted in clear text across the physical
   network used as the carrier. HTTP/1.0 does not prevent additional
   authentication schemes and encryption mechanisms from being employed
   to increase security.

12.2  Safe Methods

   The writers of client software should be aware that the software
   represents the user in their interactions over the Internet, and
   should be careful to allow the user to be aware of any actions they
   may take which may have an unexpected significance to themselves or
   others.

   In particular, the convention has been established that the GET and
   HEAD methods should never have the significance of taking an action
   other than retrieval. These methods should be considered "safe." This
   allows user agents to represent other methods, such as POST, in a
   special way, so that the user is made aware of the fact that a
   possibly unsafe action is being requested.





Berners-Lee, et al           Informational                     [Page 49]

RFC 1945                        HTTP/1.0                        May 1996


   Naturally, it is not possible to ensure that the server does not
   generate side-effects as a result of performing a GET request; in
   fact, some dynamic resources consider that a feature. The important
   distinction here is that the user did not request the side-effects,
   so therefore cannot be held accountable for them.

12.3  Abuse of Server Log Information

   A server is in the position to save personal data about a user's
   requests which may identify their reading patterns or subjects of
   interest. This information is clearly confidential in nature and its
   handling may be constrained by law in certain countries. People using
   the HTTP protocol to provide data are responsible for ensuring that
   such material is not distributed without the permission of any
   individuals that are identifiable by the published results.

12.4  Transfer of Sensitive Information

   Like any generic data transfer protocol, HTTP cannot regulate the
   content of the data that is transferred, nor is there any a priori
   method of determining the sensitivity of any particular piece of
   information within the context of any given request. Therefore,
   applications should supply as much control over this information as
   possible to the provider of that information. Three header fields are
   worth special mention in this context: Server, Referer and From.

   Revealing the specific software version of the server may allow the
   server machine to become more vulnerable to attacks against software
   that is known to contain security holes. Implementors should make the
   Server header field a configurable option.

   The Referer field allows reading patterns to be studied and reverse
   links drawn. Although it can be very useful, its power can be abused
   if user details are not separated from the information contained in
   the Referer. Even when the personal information has been removed, the
   Referer field may indicate a private document's URI whose publication
   would be inappropriate.

   The information sent in the From field might conflict with the user's
   privacy interests or their site's security policy, and hence it
   should not be transmitted without the user being able to disable,
   enable, and modify the contents of the field. The user must be able
   to set the contents of this field within a user preference or
   application defaults configuration.

   We suggest, though do not require, that a convenient toggle interface
   be provided for the user to enable or disable the sending of From and
   Referer information.



Berners-Lee, et al           Informational                     [Page 50]

RFC 1945                        HTTP/1.0                        May 1996


12.5  Attacks Based On File and Path Names

   Implementations of HTTP origin servers should be careful to restrict
   the documents returned by HTTP requests to be only those that were
   intended by the server administrators. If an HTTP server translates
   HTTP URIs directly into file system calls, the server must take
   special care not to serve files that were not intended to be
   delivered to HTTP clients. For example, Unix, Microsoft Windows, and
   other operating systems use ".." as a path component to indicate a
   directory level above the current one. On such a system, an HTTP
   server must disallow any such construct in the Request-URI if it
   would otherwise allow access to a resource outside those intended to
   be accessible via the HTTP server. Similarly, files intended for
   reference only internally to the server (such as access control
   files, configuration files, and script code) must be protected from
   inappropriate retrieval, since they might contain sensitive
   information. Experience has shown that minor bugs in such HTTP server
   implementations have turned into security risks.

13.  Acknowledgments

   This specification makes heavy use of the augmented BNF and generic
   constructs defined by David H. Crocker for RFC 822 [7]. Similarly, it
   reuses many of the definitions provided by Nathaniel Borenstein and
   Ned Freed for MIME [5]. We hope that their inclusion in this
   specification will help reduce past confusion over the relationship
   between HTTP/1.0 and Internet mail message formats.

   The HTTP protocol has evolved considerably over the past four years.
   It has benefited from a large and active developer community--the
   many people who have participated on the www-talk mailing list--and
   it is that community which has been most responsible for the success
   of HTTP and of the World-Wide Web in general. Marc Andreessen, Robert
   Cailliau, Daniel W. Connolly, Bob Denny, Jean-Francois Groff, Phillip
   M. Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob McCool, Lou
   Montulli, Dave Raggett, Tony Sanders, and Marc VanHeyningen deserve
   special recognition for their efforts in defining aspects of the
   protocol for early versions of this specification.

   Paul Hoffman contributed sections regarding the informational status
   of this document and Appendices C and D.










Berners-Lee, et al           Informational                     [Page 51]

RFC 1945                        HTTP/1.0                        May 1996


   This document has benefited greatly from the comments of all those
   participating in the HTTP-WG. In addition to those already mentioned,
   the following individuals have contributed to this specification:

       Gary Adams                         Harald Tveit Alvestrand
       Keith Ball                         Brian Behlendorf
       Paul Burchard                      Maurizio Codogno
       Mike Cowlishaw                     Roman Czyborra
       Michael A. Dolan                   John Franks
       Jim Gettys                         Marc Hedlund
       Koen Holtman                       Alex Hopmann
       Bob Jernigan                       Shel Kaphan
       Martijn Koster                     Dave Kristol
       Daniel LaLiberte                   Paul Leach
       Albert Lunde                       John C. Mallery
       Larry Masinter                     Mitra
       Jeffrey Mogul                      Gavin Nicol
       Bill Perry                         Jeffrey Perry
       Owen Rees                          Luigi Rizzo
       David Robinson                     Marc Salomon
       Rich Salz                          Jim Seidman
       Chuck Shotton                      Eric W. Sink
       Simon E. Spero                     Robert S. Thau
       Francois Yergeau                   Mary Ellen Zurko
       Jean-Philippe Martin-Flatin

14. References

   [1]  Anklesaria, F., McCahill, M., Lindner, P., Johnson, D.,
        Torrey, D., and B. Alberti, "The Internet Gopher Protocol: A
        Distributed Document Search and Retrieval Protocol", RFC 1436,
        University of Minnesota, March 1993.

   [2]  Berners-Lee, T., "Universal Resource Identifiers in WWW: A
        Unifying Syntax for the Expression of Names and Addresses of
        Objects on the Network as used in the World-Wide Web",
        RFC 1630, CERN, June 1994.

   [3]  Berners-Lee, T., and D. Connolly, "Hypertext Markup Language -
        2.0", RFC 1866, MIT/W3C, November 1995.

   [4]  Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
        Resource Locators (URL)", RFC 1738, CERN, Xerox PARC,
        University of Minnesota, December 1994.







Berners-Lee, et al           Informational                     [Page 52]

RFC 1945                        HTTP/1.0                        May 1996


   [5]  Borenstein, N., and N. Freed, "MIME (Multipurpose Internet Mail
        Extensions) Part One: Mechanisms for Specifying and Describing
        the Format of Internet Message Bodies", RFC 1521, Bellcore,
        Innosoft, September 1993.

   [6]  Braden, R., "Requirements for Internet hosts - Application and
        Support", STD 3, RFC 1123, IETF, October 1989.

   [7]  Crocker, D., "Standard for the Format of ARPA Internet Text
        Messages", STD 11, RFC 822, UDEL, August 1982.

   [8]  F. Davis, B. Kahle, H. Morris, J. Salem, T. Shen, R. Wang,
        J. Sui, and M. Grinbaum. "WAIS Interface Protocol Prototype
        Functional Specification." (v1.5), Thinking Machines
        Corporation, April 1990.

   [9]  Fielding, R., "Relative Uniform Resource Locators", RFC 1808,
        UC Irvine, June 1995.

   [10] Horton, M., and R. Adams, "Standard for interchange of USENET
        Messages", RFC 1036 (Obsoletes RFC 850), AT&T Bell
        Laboratories, Center for Seismic Studies, December 1987.

   [11] Kantor, B., and P. Lapsley, "Network News Transfer Protocol:
        A Proposed Standard for the Stream-Based Transmission of News",
        RFC 977, UC San Diego, UC Berkeley, February 1986.

   [12] Postel, J., "Simple Mail Transfer Protocol." STD 10, RFC 821,
        USC/ISI, August 1982.

   [13] Postel, J., "Media Type Registration Procedure." RFC 1590,
        USC/ISI, March 1994.

   [14] Postel, J., and J. Reynolds, "File Transfer Protocol (FTP)",
        STD 9, RFC 959, USC/ISI, October 1985.

   [15] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, RFC
        1700, USC/ISI, October 1994.

   [16] Sollins, K., and L. Masinter, "Functional Requirements for
        Uniform Resource Names", RFC 1737, MIT/LCS, Xerox Corporation,
        December 1994.

   [17] US-ASCII. Coded Character Set - 7-Bit American Standard Code
        for Information Interchange. Standard ANSI X3.4-1986, ANSI,
        1986.





Berners-Lee, et al           Informational                     [Page 53]

RFC 1945                        HTTP/1.0                        May 1996


   [18] ISO-8859. International Standard -- Information Processing --
        8-bit Single-Byte Coded Graphic Character Sets --
        Part 1: Latin alphabet No. 1, ISO 8859-1:1987.
        Part 2: Latin alphabet No. 2, ISO 8859-2, 1987.
        Part 3: Latin alphabet No. 3, ISO 8859-3, 1988.
        Part 4: Latin alphabet No. 4, ISO 8859-4, 1988.
        Part 5: Latin/Cyrillic alphabet, ISO 8859-5, 1988.
        Part 6: Latin/Arabic alphabet, ISO 8859-6, 1987.
        Part 7: Latin/Greek alphabet, ISO 8859-7, 1987.
        Part 8: Latin/Hebrew alphabet, ISO 8859-8, 1988.
        Part 9: Latin alphabet No. 5, ISO 8859-9, 1990.

15.  Authors' Addresses

   Tim Berners-Lee
   Director, W3 Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, U.S.A.

   Fax: +1 (617) 258 8682
   EMail: timbl@w3.org


   Roy T. Fielding
   Department of Information and Computer Science
   University of California
   Irvine, CA 92717-3425, U.S.A.

   Fax: +1 (714) 824-4056
   EMail: fielding@ics.uci.edu


   Henrik Frystyk Nielsen
   W3 Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, U.S.A.

   Fax: +1 (617) 258 8682
   EMail: frystyk@w3.org










Berners-Lee, et al           Informational                     [Page 54]

RFC 1945                        HTTP/1.0                        May 1996


Appendices

   These appendices are provided for informational reasons only -- they
   do not form a part of the HTTP/1.0 specification.

A.  Internet Media Type message/http

   In addition to defining the HTTP/1.0 protocol, this document serves
   as the specification for the Internet media type "message/http". The
   following is to be registered with IANA [13].

       Media Type name:         message

       Media subtype name:      http

       Required parameters:     none

       Optional parameters:     version, msgtype

              version: The HTTP-Version number of the enclosed message
                       (e.g., "1.0"). If not present, the version can be
                       determined from the first line of the body.

              msgtype: The message type -- "request" or "response". If
                       not present, the type can be determined from the
                       first line of the body.

       Encoding considerations: only "7bit", "8bit", or "binary" are
                                permitted

       Security considerations: none

B.  Tolerant Applications

   Although this document specifies the requirements for the generation
   of HTTP/1.0 messages, not all applications will be correct in their
   implementation. We therefore recommend that operational applications
   be tolerant of deviations whenever those deviations can be
   interpreted unambiguously.

   Clients should be tolerant in parsing the Status-Line and servers
   tolerant when parsing the Request-Line. In particular, they should
   accept any amount of SP or HT characters between fields, even though
   only a single SP is required.

   The line terminator for HTTP-header fields is the sequence CRLF.
   However, we recommend that applications, when parsing such headers,
   recognize a single LF as a line terminator and ignore the leading CR.



Berners-Lee, et al           Informational                     [Page 55]

RFC 1945                        HTTP/1.0                        May 1996


C.  Relationship to MIME

   HTTP/1.0 uses many of the constructs defined for Internet Mail (RFC
   822 [7]) and the Multipurpose Internet Mail Extensions (MIME [5]) to
   allow entities to be transmitted in an open variety of
   representations and with extensible mechanisms. However, RFC 1521
   discusses mail, and HTTP has a few features that are different than
   those described in RFC 1521. These differences were carefully chosen
   to optimize performance over binary connections, to allow greater
   freedom in the use of new media types, to make date comparisons
   easier, and to acknowledge the practice of some early HTTP servers
   and clients.

   At the time of this writing, it is expected that RFC 1521 will be
   revised. The revisions may include some of the practices found in
   HTTP/1.0 but not in RFC 1521.

   This appendix describes specific areas where HTTP differs from RFC
   1521. Proxies and gateways to strict MIME environments should be
   aware of these differences and provide the appropriate conversions
   where necessary. Proxies and gateways from MIME environments to HTTP
   also need to be aware of the differences because some conversions may
   be required.

C.1  Conversion to Canonical Form

   RFC 1521 requires that an Internet mail entity be converted to
   canonical form prior to being transferred, as described in Appendix G
   of RFC 1521 [5]. Section 3.6.1 of this document describes the forms
   allowed for subtypes of the "text" media type when transmitted over
   HTTP.

   RFC 1521 requires that content with a Content-Type of "text"
   represent line breaks as CRLF and forbids the use of CR or LF outside
   of line break sequences. HTTP allows CRLF, bare CR, and bare LF to
   indicate a line break within text content when a message is
   transmitted over HTTP.

   Where it is possible, a proxy or gateway from HTTP to a strict RFC
   1521 environment should translate all line breaks within the text
   media types described in Section 3.6.1 of this document to the RFC
   1521 canonical form of CRLF. Note, however, that this may be
   complicated by the presence of a Content-Encoding and by the fact
   that HTTP allows the use of some character sets which do not use
   octets 13 and 10 to represent CR and LF, as is the case for some
   multi-byte character sets.





Berners-Lee, et al           Informational                     [Page 56]

RFC 1945                        HTTP/1.0                        May 1996


C.2  Conversion of Date Formats

   HTTP/1.0 uses a restricted set of date formats (Section 3.3) to
   simplify the process of date comparison. Proxies and gateways from
   other protocols should ensure that any Date header field present in a
   message conforms to one of the HTTP/1.0 formats and rewrite the date
   if necessary.

C.3  Introduction of Content-Encoding

   RFC 1521 does not include any concept equivalent to HTTP/1.0's
   Content-Encoding header field. Since this acts as a modifier on the
   media type, proxies and gateways from HTTP to MIME-compliant
   protocols must either change the value of the Content-Type header
   field or decode the Entity-Body before forwarding the message. (Some
   experimental applications of Content-Type for Internet mail have used
   a media-type parameter of ";conversions=<content-coding>" to perform
   an equivalent function as Content-Encoding. However, this parameter
   is not part of RFC 1521.)

C.4  No Content-Transfer-Encoding

   HTTP does not use the Content-Transfer-Encoding (CTE) field of RFC
   1521. Proxies and gateways from MIME-compliant protocols to HTTP must
   remove any non-identity CTE ("quoted-printable" or "base64") encoding
   prior to delivering the response message to an HTTP client.

   Proxies and gateways from HTTP to MIME-compliant protocols are
   responsible for ensuring that the message is in the correct format
   and encoding for safe transport on that protocol, where "safe
   transport" is defined by the limitations of the protocol being used.
   Such a proxy or gateway should label the data with an appropriate
   Content-Transfer-Encoding if doing so will improve the likelihood of
   safe transport over the destination protocol.

C.5  HTTP Header Fields in Multipart Body-Parts

   In RFC 1521, most header fields in multipart body-parts are generally
   ignored unless the field name begins with "Content-". In HTTP/1.0,
   multipart body-parts may contain any HTTP header fields which are
   significant to the meaning of that part.

D.  Additional Features

   This appendix documents protocol elements used by some existing HTTP
   implementations, but not consistently and correctly across most
   HTTP/1.0 applications. Implementors should be aware of these
   features, but cannot rely upon their presence in, or interoperability



Berners-Lee, et al           Informational                     [Page 57]

RFC 1945                        HTTP/1.0                        May 1996


   with, other HTTP/1.0 applications.

D.1  Additional Request Methods

D.1.1 PUT

   The PUT method requests that the enclosed entity be stored under the
   supplied Request-URI. If the Request-URI refers to an already
   existing resource, the enclosed entity should be considered as a
   modified version of the one residing on the origin server. If the
   Request-URI does not point to an existing resource, and that URI is
   capable of being defined as a new resource by the requesting user
   agent, the origin server can create the resource with that URI.

   The fundamental difference between the POST and PUT requests is
   reflected in the different meaning of the Request-URI. The URI in a
   POST request identifies the resource that will handle the enclosed
   entity as data to be processed. That resource may be a data-accepting
   process, a gateway to some other protocol, or a separate entity that
   accepts annotations. In contrast, the URI in a PUT request identifies
   the entity enclosed with the request -- the user agent knows what URI
   is intended and the server should not apply the request to some other
   resource.

D.1.2 DELETE

   The DELETE method requests that the origin server delete the resource
   identified by the Request-URI.

D.1.3 LINK

   The LINK method establishes one or more Link relationships between
   the existing resource identified by the Request-URI and other
   existing resources.

D.1.4 UNLINK

   The UNLINK method removes one or more Link relationships from the
   existing resource identified by the Request-URI.

D.2  Additional Header Field Definitions

D.2.1 Accept

   The Accept request-header field can be used to indicate a list of
   media ranges which are acceptable as a response to the request. The
   asterisk "*" character is used to group media types into ranges, with
   "*/*" indicating all media types and "type/*" indicating all subtypes



Berners-Lee, et al           Informational                     [Page 58]

RFC 1945                        HTTP/1.0                        May 1996


   of that type. The set of ranges given by the client should represent
   what types are acceptable given the context of the request.

D.2.2 Accept-Charset

   The Accept-Charset request-header field can be used to indicate a
   list of preferred character sets other than the default US-ASCII and
   ISO-8859-1. This field allows clients capable of understanding more
   comprehensive or special-purpose character sets to signal that
   capability to a server which is capable of representing documents in
   those character sets.

D.2.3 Accept-Encoding

   The Accept-Encoding request-header field is similar to Accept, but
   restricts the content-coding values which are acceptable in the
   response.

D.2.4 Accept-Language

   The Accept-Language request-header field is similar to Accept, but
   restricts the set of natural languages that are preferred as a
   response to the request.

D.2.5 Content-Language

   The Content-Language entity-header field describes the natural
   language(s) of the intended audience for the enclosed entity. Note
   that this may not be equivalent to all the languages used within the
   entity.

D.2.6 Link

   The Link entity-header field provides a means for describing a
   relationship between the entity and some other resource. An entity
   may include multiple Link values. Links at the metainformation level
   typically indicate relationships like hierarchical structure and
   navigation paths.

D.2.7 MIME-Version

   HTTP messages may include a single MIME-Version general-header field
   to indicate what version of the MIME protocol was used to construct
   the message. Use of the MIME-Version header field, as defined by RFC
   1521 [5], should indicate that the message is MIME-conformant.
   Unfortunately, some older HTTP/1.0 servers send it indiscriminately,
   and thus this field should be ignored.




Berners-Lee, et al           Informational                     [Page 59]

RFC 1945                        HTTP/1.0                        May 1996


D.2.8 Retry-After

   The Retry-After response-header field can be used with a 503 (service
   unavailable) response to indicate how long the service is expected to
   be unavailable to the requesting client. The value of this field can
   be either an HTTP-date or an integer number of seconds (in decimal)
   after the time of the response.

D.2.9 Title

   The Title entity-header field indicates the title of the entity.

D.2.10 URI

   The URI entity-header field may contain some or all of the Uniform
   Resource Identifiers (Section 3.2) by which the Request-URI resource
   can be identified. There is no guarantee that the resource can be
   accessed using the URI(s) specified.

































Berners-Lee, et al           Informational                     [Page 60]


Added doc/rfc2145.txt.












































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                        J. C. Mogul
Request for Comments: 2145                                           DEC
Category: Informational                                      R. Fielding
                                                               UC Irvine
                                                               J. Gettys
                                                                     DEC
                                                              H. Frystyk
                                                                 MIT/LCS
                                                                May 1997

                       Use and Interpretation of
                          HTTP Version Numbers

Status of this Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

   Distribution of this document is unlimited.  Please send comments to
   the HTTP working group at <http-wg@cuckoo.hpl.hp.com>.  Discussions
   of the working group are archived at
   <URL:http://www.ics.uci.edu/pub/ietf/http/>.  General discussions
   about HTTP and the applications which use HTTP should take place on
   the <www-talk@w3.org> mailing list.

Abstract

   HTTP request and response messages include an HTTP protocol version
   number.  Some confusion exists concerning the proper use and
   interpretation of HTTP version numbers, and concerning
   interoperability of HTTP implementations of different protocol
   versions.  This document is an attempt to clarify the situation.  It
   is not a modification of the intended meaning of the existing
   HTTP/1.0 and HTTP/1.1 documents, but it does describe the intention
   of the authors of those documents, and can be considered definitive
   when there is any ambiguity in those documents concerning HTTP
   version numbers, for all versions of HTTP.













Mogul, et. al.               Informational                      [Page 1]

RFC 2145                  HTTP Version Numbers                  May 1997


TABLE OF CONTENTS

   1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . .  2
        1.1 Robustness Principle . . . . . . . . . . . . . . . . . .  3
   2 HTTP version numbers. . . . . . . . . . . . . . . . . . . . . .  3
   2.1 Proxy behavior. . . . . . . . . . . . . . . . . . . . . . . .  4
        2.2 Compatibility between minor versions of the same major
            version. . . . . . . .  . . . . . . . .  . . . . . . . .  4
        2.3 Which version number to send in a message. . . . . . . .  5
   3 Security Considerations . . . . . . . . . . . . . . . . . . . .  6
   4 References. . . . . . . . . . . . . . . . . . . . . . . . . . .  6
   5 Authors' addresses. . . . . . . . . . . . . . . . . . . . . . .  6

1 Introduction

   HTTP request and response messages include an HTTP protocol version
   number.  According to section 3.1 of the HTTP/1.1 specification [2],

         HTTP uses a "<major>.<minor>" numbering scheme to indicate
      versions of the protocol. The protocol versioning policy is
      intended to allow the sender to indicate the format of a message
      and its capacity for understanding further HTTP communication,
      rather than the features obtained via that communication.  No
      change is made to the version number for the addition of message
      components which do not affect communication behavior or which
      only add to extensible field values.  The <minor> number is
      incremented when the changes made to the protocol add features
      which do not change the general message parsing algorithm, but
      which may add to the message semantics and imply additional
      capabilities of the sender. The <major> number is incremented when
      the format of a message within the protocol is changed.

   The same language appears in the description of HTTP/1.0 [1].

   Many readers of these documents have expressed some confusion about
   the intended meaning of this policy.  Also, some people who wrote
   HTTP implementations before RFC1945 [1] was issued were not aware of
   the intentions behind the introduction of version numbers in
   HTTP/1.0.  This has led to debate and inconsistency regarding the use
   and interpretation of HTTP version numbers, and has led to
   interoperability problems in certain cases.










Mogul, et. al.               Informational                      [Page 2]

RFC 2145                  HTTP Version Numbers                  May 1997


   This document is an attempt to clarify the situation.  It is not a
   modification of the intended meaning of the existing HTTP/1.0 and
   HTTP/1.1 documents, but it does describe the intention of the authors
   of those documents.  In any case where either of those two documents
   is ambiguous regarding the use and interpretation of HTTP version
   numbers, this document should be considered the definitive as to the
   intentions of the designers of HTTP.

   The specification described in this document is not part of the
   specification of any individual version of HTTP, such as HTTP/1.0 or
   HTTP/1.1.  Rather, this document describes the use of HTTP version
   numbers in any version of HTTP (except for HTTP/0.9, which did not
   include version numbers).

   No vendor or other provider of an HTTP implementation should claim
   any compliance with any IETF HTTP specification unless the
   implementation conditionally complies with the rules in this
   document.

1.1 Robustness Principle

   RFC791 [4] defines the "robustness principle" in section 3.2:

          an implementation must be conservative in its sending
       behavior, and liberal in its receiving behavior.

   This principle applies to HTTP, as well.  It is the fundamental basis
   for interpreting any part of the HTTP specification that might still
   be ambiguous.  In particular, implementations of HTTP SHOULD NOT
   reject messages or generate errors unnecessarily.

2 HTTP version numbers

   We start by restating the language quoted above from section 3.1 of
   the HTTP/1.1 specification [2]:

         It is, and has always been, the explicit intent of the
      HTTP specification that the interpretation of an HTTP message
      header does not change between minor versions of the same major
      version.

         It is, and has always been, the explicit intent of the
      HTTP specification that an implementation receiving a message
      header that it does not understand MUST ignore that header.  (The
      word "ignore" has a special meaning for proxies; see section 2.1
      below.)





Mogul, et. al.               Informational                      [Page 3]

RFC 2145                  HTTP Version Numbers                  May 1997


   To make this as clear as possible:  The major version sent in a
   message MAY indicate the interpretation of other header fields.  The
   minor version sent in a message MUST NOT indicate the interpretation
   of other header fields.  This reflects the principle that the minor
   version labels the capability of the sender, not the interpretation
   of the message.

      Note: In a future version of HTTP, we may introduce a mechanism
      that explicitly requires a receiving implementation to reject a
      message if it does not understand certain headers.  For example,
      this might be implemented by means of a header that lists a set of
      other message headers that must be understood by the recipient.
      Any implementation claiming at least conditional compliance with
      this future version of HTTP would have to implement this
      mechanism.  However, no implementation claiming compliance with a
      lower HTTP version (in particular, HTTP/1.1) will have to
      implement this mechanism.

      This future change may be required to support the Protocol
      Extension Protocol (PEP) [3].

   One consequence of these rules is that an HTTP/1.1 message sent to an
   HTTP/1.0 recipient (or a recipient whose version is unknown) MUST be
   constructed so that it remains a valid HTTP/1.0 message when all
   headers not defined in the HTTP/1.0 specification [1] are removed.

2.1 Proxy behavior

   A proxy MUST forward an unknown header, unless it is protected by a
   Connection header.  A proxy implementing an HTTP version >= 1.1 MUST
   NOT forward unknown headers that are protected by a Connection
   header, as described in section 14.10 of the HTTP/1.1 specification
   [2].

   We remind the reader that that HTTP version numbers are hop-by-hop
   components of HTTP messages, and are not end-to-end.  That is, an
   HTTP proxy never "forwards" an HTTP version number in either a
   request or response.

2.2 Compatibility between minor versions of the same major version

   An implementation of HTTP/x.b sending a message to a recipient whose
   version is known to be HTTP/x.a, a < b, MAY send a header that is not
   defined in the specification for HTTP/x.a.  For example, an HTTP/1.1
   server may send a "Cache-control" header to an HTTP/1.0 client; this
   may be useful if the immediate recipient is an HTTP/1.0 proxy, but
   the ultimate recipient is an HTTP/1.1 client.




Mogul, et. al.               Informational                      [Page 4]

RFC 2145                  HTTP Version Numbers                  May 1997


   An implementation of HTTP/x.b sending a message to a recipient whose
   version is known to be HTTP/x.a, a < b, MUST NOT depend on the
   recipient understanding a header not defined in the specification for
   HTTP/x.a.  For example, HTTP/1.0 clients cannot be expected to
   understand chunked encodings, and so an HTTP/1.1 server must never
   send "Transfer-Encoding: chunked" in response to an HTTP/1.0 request.

2.3 Which version number to send in a message

   The most strenuous debate over the use of HTTP version numbers has
   centered on the problem of implementations that do not follow the
   robustness principle, and which fail to produce useful results when
   they receive a message with an HTTP minor version higher than the
   minor version they implement.  We consider these implementations
   buggy, but we recognize that the robustness principle also implies
   that message senders should make concessions to buggy implementations
   when this is truly necessary for interoperation.

   An HTTP client SHOULD send a request version equal to the highest
   version for which the client is at least conditionally compliant, and
   whose major version is no higher than the highest version supported
   by the server, if this is known.  An HTTP client MUST NOT send a
   version for which it is not at least conditionally compliant.

   An HTTP client MAY send a lower request version, if it is known that
   the server incorrectly implements the HTTP specification, but only
   after the client has determined that the server is actually buggy.

   An HTTP server SHOULD send a response version equal to the highest
   version for which the server is at least conditionally compliant, and
   whose major version is less than or equal to the one received in the
   request.  An HTTP server MUST NOT send a version for which it is not
   at least conditionally compliant.  A server MAY send a 505 (HTTP
   Version Not Supported) response if cannot send a response using the
   major version used in the client's request.

   An HTTP server MAY send a lower response version, if it is known or
   suspected that the client incorrectly implements the HTTP
   specification, but this should not be the default, and this SHOULD
   NOT be done if the request version is HTTP/1.1 or greater.











Mogul, et. al.               Informational                      [Page 5]

RFC 2145                  HTTP Version Numbers                  May 1997


3 Security Considerations

   None, except to the extent that security mechanisms introduced in one
   version of HTTP might depend on the proper interpretation of HTTP
   version numbers in older implementations.

4 References

   1.  Berners-Lee, T.,  R. Fielding, and H. Frystyk.  Hypertext
   Transfer Protocol -- HTTP/1.0.  RFC 1945, HTTP Working Group, May,
   1996.

   2.  Fielding, Roy T., Jim Gettys, Jeffrey C. Mogul, Henrik Frystyk
   Nielsen, and Tim Berners-Lee.  Hypertext Transfer Protocol --
   HTTP/1.1.  RFC 2068, HTTP Working Group, January, 1997.

   3.  Khare, Rohit.  HTTP/1.2 Extension Protocol (PEP).  HTTP Working
   Group, Work in Progress.

   4.  Postel, Jon.  Internet Protocol.  RFC 791, NIC, September, 1981.

5 Authors' addresses

   Jeffrey C. Mogul
   Western Research Laboratory
   Digital Equipment Corporation
   250 University Avenue
   Palo Alto, California, 94305, USA
   Email: mogul@wrl.dec.com

   Roy T. Fielding
   Department of Information and Computer Science
   University of California
   Irvine, CA 92717-3425, USA
   Fax: +1 (714) 824-4056
   Email: fielding@ics.uci.edu

   Jim Gettys
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, USA
   Fax: +1 (617) 258 8682
   Email: jg@w3.org








Mogul, et. al.               Informational                      [Page 6]

RFC 2145                  HTTP Version Numbers                  May 1997


   Henrik Frystyk Nielsen
   W3 Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, USA
   Fax: +1 (617) 258 8682
   Email: frystyk@w3.org












































Mogul, et. al.               Informational                      [Page 7]


Added doc/rfc2295.txt.




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                         K. Holtman
Request for Comments: 2295                                           TUE
Category: Experimental                                           A. Mutz
                                                         Hewlett-Packard
                                                              March 1998


                Transparent Content Negotiation in HTTP

Status of this Memo

   This memo defines an Experimental Protocol for the Internet
   community.  It does not specify an Internet standard of any kind.
   Discussion and suggestions for improvement are requested.
   Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (1998).  All Rights Reserved.

ABSTRACT

   HTTP allows web site authors to put multiple versions of the same
   information under a single URL.  Transparent content negotiation is
   an extensible negotiation mechanism, layered on top of HTTP, for
   automatically selecting the best version when the URL is accessed.
   This enables the smooth deployment of new web data formats and markup
   tags.

TABLE OF CONTENTS

   1  Introduction................................................4
    1.1 Background................................................4

   2  Terminology.................................................5
    2.1 Terms from HTTP/1.1.......................................5
    2.2 New terms.................................................6

   3  Notation....................................................8

   4  Overview....................................................9
    4.1 Content negotiation.......................................9
    4.2 HTTP/1.0 style negotiation scheme.........................9
    4.3 Transparent content negotiation scheme...................10
    4.4 Optimizing the negotiation process.......................12
    4.5 Downwards compatibility with non-negotiating user agents.14
    4.6 Retrieving a variant by hand.............................15
    4.7 Dimensions of negotiation................................15



Holtman & Mutz                Experimental                      [Page 1]

RFC 2295            Transparent Content Negotiation           March 1998


    4.8 Feature negotiation......................................15
    4.9 Length of variant lists..................................16
    4.10 Relation with other negotiation schemes.................16

   5  Variant descriptions.......................................17
    5.1 Syntax...................................................17
    5.2 URI......................................................17
    5.3 Source-quality...........................................18
    5.4 Type, charset, language, and length......................19
    5.5 Features.................................................19
    5.6 Description..............................................19
    5.7 Extension-attribute......................................20

   6  Feature negotiation........................................20
    6.1 Feature tags.............................................20
    6.1.1 Feature tag values.....................................21
    6.2 Feature sets.............................................21
    6.3 Feature predicates.......................................22
    6.4 Features attribute.......................................24

   7  Remote variant selection algorithms........................25
    7.1 Version numbers..........................................25

   8  Content negotiation status codes and headers...............25
    8.1 506 Variant Also Negotiates..............................25
    8.2 Accept-Features..........................................26
    8.3 Alternates...............................................27
    8.4 Negotiate................................................28
    8.5 TCN......................................................30
    8.6 Variant-Vary.............................................30

   9  Cache validators...........................................31
    9.1 Variant list validators..................................31
    9.2 Structured entity tags...................................31
    9.3 Assigning entity tags to variants........................32

   10 Content negotiation responses..............................32
    10.1 List response...........................................33
    10.2 Choice response.........................................34
    10.3 Adhoc response..........................................37
    10.4 Reusing the Alternates header...........................38
    10.5 Extracting a normal response from a choice response.....39
    10.6 Elaborate Vary headers..................................39
    10.6.1 Construction of an elaborate Vary header..............40
    10.6.2 Caching of an elaborate Vary header...................41
    10.7 Adding an Expires header for HTTP/1.0 compatibility.....41
    10.8 Negotiation on content encoding.........................41




Holtman & Mutz                Experimental                      [Page 2]

RFC 2295            Transparent Content Negotiation           March 1998


   11 User agent support for transparent negotiation.............42
    11.1 Handling of responses...................................42
    11.2 Presentation of a transparently negotiated resource.....42

   12 Origin server support for transparent negotiation..........43
    12.1 Requirements............................................43
    12.2 Negotiation on transactions other than GET and HEAD.....45

   13 Proxy support for transparent negotiation..................45

   14 Security and privacy considerations........................46
    14.1 Accept- headers revealing personal information..........46
    14.2 Spoofing of responses from variant resources............47
    14.3 Security holes revealed by negotiation..................47

   15 Internationalization considerations........................47

   16 Acknowledgments............................................47

   17 References.................................................48

   18 Authors' Addresses.........................................48

   19 Appendix: Example of a local variant selection algorithm...49
    19.1 Computing overall quality values........................49
    19.2 Determining the result..................................51
    19.3 Ranking dimensions......................................51

   20 Appendix: feature negotiation examples.....................52
    20.1 Use of feature tags.....................................52
    20.2 Use of numeric feature tags.............................53
    20.3 Feature tag design......................................53

   21 Appendix: origin server implementation considerations......54
    21.1 Implementation with a CGI script........................54
    21.2 Direct support by HTTP servers..........................55
    21.3 Web publishing tools....................................55

   22 Appendix: Example of choice response construction..........55

   23 Full Copyright Statement...................................58










Holtman & Mutz                Experimental                      [Page 3]

RFC 2295            Transparent Content Negotiation           March 1998


1  Introduction

   HTTP allows web site authors to put multiple versions of the same
   information under a single URI.  Each of these versions is called a
   `variant'.  Transparent content negotiation is an extensible
   negotiation mechanism for automatically and efficiently retrieving
   the best variant when a GET or HEAD request is made.  This enables
   the smooth deployment of new web data formats and markup tags.

   This specification defines transparent content negotiation as an
   extension on top of the HTTP/1.1 protocol [1].  However, use of this
   extension does not require use of HTTP/1.1: transparent content
   negotiation can also be done if some or all of the parties are
   HTTP/1.0 [2] systems.

   Transparent content negotiation is called `transparent' because it
   makes all variants which exist inside the origin server visible to
   outside parties.

     Note: Some members of the IETF are currently undertaking a number
     of activities which are loosely related to this experimental
     protocol.  First, there is an effort to define a protocol-
     independent registry for feature tags.  The intention is that this
     experimental protocol will be one of the clients of the registry.
     Second, some research is being done on content negotiation systems
     for other transport protocols (like internet mail and internet fax)
     and on generalized negotiation systems for multiple transport
     protocols.  At the time of writing, it is unclear if or when this
     research will lead to results in the form of complete negotiation
     system specifications.  It is also unclear to which extent possible
     future specifications can or will re-use elements of this
     experimental protocol.

1.1 Background

   The addition of content negotiation to the web infrastructure has
   been considered important since the early days of the web.  Among the
   expected benefits of a sufficiently powerful system for content
   negotiation are

     * smooth deployment of new data formats and markup tags will
       allow graceful evolution of the web

     * eliminating the need to choose between a `state of the art
       multimedia homepage' and one which can be viewed by all web users

     * enabling good service to a wider range of browsing
       platforms (from low-end PDA's to high-end VR setups)



Holtman & Mutz                Experimental                      [Page 4]

RFC 2295            Transparent Content Negotiation           March 1998


     * eliminating error-prone and cache-unfriendly
       User-Agent based negotiation

     * enabling construction of sites without `click here for the X
       version' links

     * internationalization, and the ability to offer multi-lingual
       content without a bias towards one language.

2  Terminology

   The words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in
   this document are to be interpreted as described in RFC 2119 [4].

   This specification uses the term `header' as an abbreviation for for
   `header field in a request or response message'.

2.1 Terms from HTTP/1.1

   This specification mostly uses the terminology of the HTTP/1.1
   specification [1].  For the convenience of the reader, this section
   reproduces some key terminology definition from [1].

   request
     An HTTP request message.

   response
     An HTTP response message.

   resource
     A network data object or service that can be identified by a URI.
     Resources may be available in multiple representations (e.g.
     multiple languages, data formats, size, resolutions) or vary in
     other ways.

   content negotiation
     The mechanism for selecting the appropriate representation when
     servicing a request.

   client
     A program that establishes connections for the purpose of sending
     requests.

   user agent
     The client which initiates a request.  These are often browsers,
     editors, spiders (web-traversing robots), or other end user tools.





Holtman & Mutz                Experimental                      [Page 5]

RFC 2295            Transparent Content Negotiation           March 1998


   server
     An application program that accepts connections in order to service
     requests by sending back responses.  Any given program may be
     capable of being both a client and a server; our use of these terms
     refers only to the role being performed by the program for a
     particular connection, rather than to the program's capabilities in
     general.  Likewise, any server may act as an origin server, proxy,
     gateway, or tunnel, switching behavior based on the nature of each
     request.

   origin server
     The server on which a given resource resides or is to be created.

   proxy
     An intermediary program which acts as both a server and a client
     for the purpose of making requests on behalf of other clients.
     Requests are serviced internally or by passing them on, with
     possible translation, to other servers.  A proxy must implement
     both the client and server requirements of this specification.

   age
     The age of a response is the time since it was sent by, or
     successfully validated with, the origin server.

   fresh
     A response is fresh if its age has not yet exceeded its freshness
     lifetime.

2.2 New terms

   transparently negotiable resource
     A resource, identified by a single URI, which has multiple
     representations (variants) associated with it.  When servicing a
     request on its URI, it allows selection of the best representation
     using the transparent content negotiation mechanism.  A
     transparently negotiable resource always has a variant list bound
     to it, which can be represented as an Alternates header (defined in
     section 8.3).

   variant list
     A list containing variant descriptions, which can be bound to a
     transparently negotiable resource.









Holtman & Mutz                Experimental                      [Page 6]

RFC 2295            Transparent Content Negotiation           March 1998


   variant description
     A machine-readable description of a variant resource, usually found
     in a variant list.  A variant description contains the variant
     resource URI and various attributes which describe properties of
     the variant.  Variant descriptions are defined in section 5.

   variant resource
     A resource from which a variant of a negotiable resource can be
     retrieved with a normal HTTP/1.x GET request, i.e. a GET request
     which does not use transparent content negotiation.

   neighboring variant
     A variant resource is called a neighboring variant resource of some
     transparently negotiable HTTP resource if the variant resource has
     a HTTP URL, and if the absolute URL of the variant resource up to
     its last slash equals the absolute URL of the negotiable resource
     up to its last slash, where equality is determined with the URI
     comparison rules in section 3.2.3 of [1].  The property of being a
     neighboring variant is important because of security considerations
     (section 14.2).  Not all variants of a negotiable resource need to
     be neighboring variants.  However, access to neighboring variants
     can be more highly optimized by the use of remote variant selection
     algorithms (section 7) and choice responses (section 10.2).

   remote variant selection algorithm
     A standardized algorithm by which a server can sometimes choose a
     best variant on behalf of a negotiating user agent.  The algorithm
     typically computes whether the Accept- headers in the request
     contain sufficient information to allow a choice, and if so, which
     variant is the best variant.  The use of a remote algorithm can
     speed up the negotiation process.

   list response
     A list response returns the variant list of the negotiable
     resource, but no variant data.  It can be generated when the server
     does not want to, or is not allowed to, return a particular best
     variant for the request.  List responses are defined in section
     10.1.

   choice response
     A choice response returns a representation of the best variant for
     the request, and may also return the variant list of the negotiable
     resource.  It can be generated when the server has sufficient
     information to be able to choose the best variant on behalf the
     user agent, but may only be generated if this best variant is a
     neighboring variant.  Choice responses are defined in section 10.2.





Holtman & Mutz                Experimental                      [Page 7]

RFC 2295            Transparent Content Negotiation           March 1998


   adhoc response
     An adhoc response can be sent by an origin server as an extreme
     measure, to achieve compatibility with a non-negotiating or buggy
     client if this compatibility cannot be achieved by sending a list
     or choice response.  There are very little requirements on the
     contents of an adhoc response.  Adhoc responses are defined in
     section 10.3.

   Accept- headers
     The request headers: Accept, Accept-Charset, Accept-Language, and
     Accept-Features.

   supports transparent content negotiation
     From the viewpoint of an origin server or proxy, a user agent
     supports transparent content negotiation if and only if it sends a
     Negotiate header (section 8.4) which indicates such support.

   server-side override
     If a request on a transparently negotiated resource is made by a
     client which supports transparent content negotiation, an origin
     server is said to perform a server-side override if the server
     ignores the directives in the Negotiate request header, and instead
     uses a custom algorithm to choose an appropriate response.  A
     server-side override can sometimes be used to work around known
     client bugs.  It could also be used by protocol extensions on top
     of transparent content negotiation.

3  Notation

   The version of BNF used in this document is taken from [1], and many
   of the nonterminals used are defined in [1].  Note that the
   underlying charset is US-ASCII.

   One new BNF construct is added:

      1%rule

   stands for one or more instances of "rule", separated by whitespace:

      1%rule =  rule *( 1*LWS rule )

   This specification also introduces

      number = 1*DIGIT

      short-float = 1*3DIGIT [ "." 0*3DIGIT ]





Holtman & Mutz                Experimental                      [Page 8]

RFC 2295            Transparent Content Negotiation           March 1998


   This specification uses the same conventions as in [1] (see section
   1.2 of [1]) for defining the significance of each particular
   requirement.

4  Overview

   This section gives an overview of transparent content negotiation.
   It starts with a more general discussion of negotiation as provided
   by HTTP.

4.1 Content negotiation

   HTTP/1.1 allows web site authors to put multiple versions of the same
   information under a single resource URI.  Each of these versions is
   called a `variant'. For example, a resource http://x.org/paper could
   bind to three different variants of a paper:

         1. HTML, English
         2. HTML, French
         3. Postscript, English

   Content negotiation is the process by which the best variant is
   selected if the resource is accessed.  The selection is done by
   matching the properties of the available variants to the capabilities
   of the user agent and the preferences of the user.

   It has always been possible under HTTP to have multiple
   representations available for one resource, and to return the most
   appropriate representation for each subsequent request.  However,
   HTTP/1.1 is the first version of HTTP which has provisions for doing
   this in a cache-friendly way.  These provisions include the Vary
   response header, entity tags, and the If-None-Match request header.

4.2 HTTP/1.0 style negotiation scheme

   The HTTP/1.0 protocol elements allow for a negotiation scheme as
   follows:

      Server _____ proxy _____ proxy _____ user
      x.org        cache       cache       agent

        < ----------------------------------
        |      GET http://x.org/paper
        |          Accept- headers
      choose
        |
         ---------------------------------- >
                    Best variant



Holtman & Mutz                Experimental                      [Page 9]

RFC 2295            Transparent Content Negotiation           March 1998


   When the resource is accessed, the user agent sends (along with its
   request) various Accept- headers which express the user agent
   capabilities and the user preferences.  Then the origin server uses
   these Accept- headers to choose the best variant, which is returned
   in the response.

   The biggest problem with this scheme is that it does not scale well.
   For all but the most minimal user agents, Accept- headers expressing
   all capabilities and preferences would be very large, and sending
   them in every request would be hugely inefficient, in particular
   because only a small fraction of the resources on the web have
   multiple variants.

4.3 Transparent content negotiation scheme

   The transparent content negotiation scheme eliminates the need to
   send huge Accept- headers, and nevertheless allows for a selection
   process that always yields either the best variant, or an error
   message indicating that user agent is not capable of displaying any
   of the available variants.

   Under the transparent content negotiation scheme, the server sends a
   list with the available variants and their properties to the user
   agent.  An example of a list with three variants is

      {"paper.1" 0.9 {type text/html} {language en}},
      {"paper.2" 0.7 {type text/html} {language fr}},
      {"paper.3" 1.0 {type application/postscript} {language en}}

   The syntax and semantics of the variant descriptions in this list are
   covered in section 5.  When the list is received, the user agent can
   choose the best variant and retrieve it.  Graphically, the
   communication can be represented as follows:


















Holtman & Mutz                Experimental                     [Page 10]

RFC 2295            Transparent Content Negotiation           March 1998


      Server _____ proxy _____ proxy _____ user
      x.org        cache       cache       agent

        < ----------------------------------
        |      GET http://x.org/paper
        |
        ----------------------------------- >         [list response]
                  return of list            |
                                         choose
                                            |
        < ----------------------------------
        |  GET http://x.org/paper.1
        |
         ---------------------------------- >         [normal response]
                return of paper.1

   The first response returning the list of variants is called a `list
   response'.  The second response is a normal HTTP response: it does
   not contain special content negotiation related information.  Only
   the user agent needs to know that the second request actually
   retrieves a variant.  For the other parties in the communication, the
   second transaction is indistinguishable from a normal HTTP
   transaction.

   With this scheme, information about capabilities and preferences is
   only used by the user agent itself.  Therefore, sending such
   information in large Accept- headers is unnecessary.  Accept- headers
   do have a limited use in transparent content negotiation however; the
   sending of small Accept- headers can often speed up the negotiation
   process. This is covered in section 4.4.

   List responses are covered in section 10.1.  As an example, the list
   response in the above picture could be:

     HTTP/1.1 300 Multiple Choices
     Date: Tue, 11 Jun 1996 20:02:21 GMT
     TCN: list
     Alternates: {"paper.1" 0.9 {type text/html} {language en}},
                 {"paper.2" 0.7 {type text/html} {language fr}},
                 {"paper.3" 1.0 {type application/postscript}
                     {language en}}
     Vary: negotiate, accept, accept-language
     ETag: "blah;1234"
     Cache-control: max-age=86400
     Content-Type: text/html
     Content-Length: 227
     <h2>Multiple Choices:</h2>
     <ul>



Holtman & Mutz                Experimental                     [Page 11]

RFC 2295            Transparent Content Negotiation           March 1998


     <li><a href=paper.1>HTML, English version</a>
     <li><a href=paper.2>HTML, French version</a>
     <li><a href=paper.3>Postscript, English version</a>
     </ul>

   The Alternates header in the response contains the variant list.  The
   Vary header is included to ensure correct caching by plain HTTP/1.1
   caches (see section 10.6).  The ETag header allows the response to be
   revalidated by caches, the Cache-Control header controls this
   revalidation.  The HTML entity included in the response allows the
   user to select the best variant by hand if desired.

4.4 Optimizing the negotiation process

   The basic transparent negotiation scheme involves two HTTP
   transactions: one to retrieve the list, and a second one to retrieve
   the chosen variant.  There are however several ways to `cut corners'
   in the data flow path of the basic scheme.

   First, caching proxies can cache both variant lists and variants.
   Such caching can reduce the communication overhead, as shown in the
   following example:

      Server _____ proxy _____ proxy __________ user
      x.org        cache       cache            agent

                                 < --------------
                                 |  GET ../paper
                                 |
                               has the list
                               in cache
                                 |
                                  -------------  >  [list response]
                                           list  |
                                                 |
                                              choose
                                                 |
                     < --------------------------
                     |   GET ../paper.1
                     |
                  has the variant
                  in cache
                     |
                      -------------------------- >  [normal response]
                         return of paper.1






Holtman & Mutz                Experimental                     [Page 12]

RFC 2295            Transparent Content Negotiation           March 1998


   Second, the user agent can send small Accept- headers, which may
   contain enough information to allow the server to choose the best
   variant and return it directly.

      Server _____ proxy _____ proxy _____ user
      x.org        cache       cache       agent

        < ----------------------------------
        |      GET http://x.org/paper
        |       small Accept- headers
        |
      able to choose on
      behalf of user agent
        |
         ---------------------------------- >    [choice response]
              return of paper.1 and list

   This choosing based on small Accept- headers is done with a `remote
   variant selection algorithm'.  Such an algorithm takes the variant
   list and the Accept- headers as input.  It then computes whether the
   Accept- headers contain sufficient information to choose on behalf of
   the user agent, and if so, which variant is the best variant.  If the
   best variant is a neighboring variant, it may be returned, together
   with the variant list, in a choice response.

   A server may only choose on behalf of a user agent supporting
   transparent content negotiation if the user agent explicitly allows
   the use of a particular remote variant selection algorithm in the
   Negotiate request header.  User agents with sophisticated internal
   variant selection algorithms may want to disallow a remote choice, or
   may want to allow it only when retrieving inline images.  If the
   local algorithm of the user agent is superior in only some difficult
   areas of negotiation, it is possible to enable the remote algorithm
   for the easy areas only.  More information about the use of a remote
   variant selection algorithm can be found in [3].

   Choice responses are covered in section 10.2.  For example, the
   choice response in the above picture could be:

     HTTP/1.1 200 OK
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     TCN: choice
     Content-Type: text/html
     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
     Content-Length: 5327
     Cache-control: max-age=604800
     Content-Location: paper.1
     Alternates: {"paper.1" 0.9 {type text/html} {language en}},



Holtman & Mutz                Experimental                     [Page 13]

RFC 2295            Transparent Content Negotiation           March 1998


                 {"paper.2" 0.7 {type text/html} {language fr}},
                 {"paper.3" 1.0 {type application/postscript}
                     {language en}}
     Etag: "gonkyyyy;1234"
     Vary: negotiate, accept, accept-language
     Expires: Thu, 01 Jan 1980 00:00:00 GMT

     <title>A paper about ....

   Finally, the above two kinds of optimization can be combined; a
   caching proxy which has the list will sometimes be able to choose on
   behalf of the user agent.  This could lead to the following
   communication pattern:

      Server _____ proxy _____ proxy __________ user
      x.org        cache       cache            agent

                                 < ---------------
                                 |  GET ../paper
                                 |  small Accept
                                 |
                              able to choose
                                on behalf
                                 |
                     < ----------
                     |  GET ../paper.1
                     |
                      ---------- >   [normal response]
                        paper.1  |
                                  ---------------- >  [choice response]
                                   paper.1 and list

   Note that this cutting of corners not only saves bandwidth, it also
   eliminates delays due to packet round trip times, and reduces the
   load on the origin server.

4.5 Downwards compatibility with non-negotiating user agents

   To handle requests from user agents which do not support transparent
   content negotiation, this specification allows the origin server to
   revert to a HTTP/1.0 style negotiation scheme.  The specification of
   heuristics for such schemes is beyond the scope of this document.









Holtman & Mutz                Experimental                     [Page 14]

RFC 2295            Transparent Content Negotiation           March 1998


4.6 Retrieving a variant by hand

   It is always possible for a user agent to retrieve the variant list
   which is bound to a negotiable resource.  The user agent can use this
   list to make available a menu of all variants and their
   characteristics to the user.  Such a menu allows the user to randomly
   browse other variants, and makes it possible to manually correct any
   sub-optimal choice made by the automatic negotiation process.

4.7 Dimensions of negotiation

   Transparent content negotiation defines four dimensions of
   negotiation:

      1. Media type (MIME type)
      2. Charset
      3. Language
      4. Features

   The first three dimensions have traditionally been present in HTTP.
   The fourth dimension is added by this specification.  Additional
   dimensions, beyond the four mentioned above, could be added by future
   specifications.

   Negotiation on the content encoding of a response (gzipped,
   compressed, etc.) is left outside of the realm of transparent
   negotiation.   See section 10.8 for more information.

4.8 Feature negotiation

   Feature negotiation intends to provide for all areas of negotiation
   not covered by the type, charset, and language dimensions.  Examples
   are negotiation on

      * HTML extensions
      * Extensions of other media types
      * Color capabilities of the user agent
      * Screen size
      * Output medium (screen, paper, ...)
      * Preference for speed vs. preference for graphical detail

   The feature negotiation framework (section 6) is the principal means
   by which transparent negotiation offers extensibility; a new
   dimension of negotiation (really a sub-dimension of the feature
   dimension) can be added without the need for a new standards effort
   by the simple registration of a `feature tag'.





Holtman & Mutz                Experimental                     [Page 15]

RFC 2295            Transparent Content Negotiation           March 1998


4.9 Length of variant lists

   As a general rule, variant lists should be short: it is expected that
   a typical transparently negotiable resource will have 2 to 10
   variants, depending on its purpose.  Variant lists should be short
   for a number of reasons:

     1. The user must be able to pick a variant by hand to correct a
        bad automatic choice, and this is more difficult with a long
        variant list.

     2. A large number of variants will decrease the efficiency of
        internet proxy caches.

     3. Long variant lists will make some transparently negotiated
        responses longer.

   In general, it is not desirable to create a transparently negotiable
   resource with hundreds of variants in order to fine-tune the
   graphical presentation of a resource.  Any graphical fine-tuning
   should be done, as much as possible, by using constructs which act at
   the user agent side, for example

      <center><img src=titlebanner.gif width=100%
      alt="MegaBozo Corp"></center>

   In order to promote user agent side fine tuning, which is more
   scalable than fine tuning over the network, user agents which
   implement a scripting language for content rendering are encouraged
   to make the availability of this language visible for transparent
   content negotiation, and to allow rendering scripts to access the
   capabilities and preferences data used for content negotiation, as
   far as privacy considerations permit this.

4.10 Relation with other negotiation schemes

   The HTTP/1.x protocol suite allows for many different negotiation
   mechanisms.  Transparent content negotiation specializes in scalable,
   interoperable negotiation of content representations at the HTTP
   level.  It is intended that transparent negotiation can co-exist with
   other negotiation schemes, both open and proprietary, which cover
   different application domains or work at different points in the
   author-to-user chain.  Ultimately, it will be up to the resource
   author to decide which negotiation mechanism, or combination of
   negotiation mechanisms, is most appropriate for the task at hand.






Holtman & Mutz                Experimental                     [Page 16]

RFC 2295            Transparent Content Negotiation           March 1998


5  Variant descriptions

5.1 Syntax

   A variant can be described in a machine-readable way with a variant
   description.

       variant-description =
                  "{" <"> URI <"> source-quality *variant-attribute"}"

       source-quality = qvalue

       variant-attribute = "{" "type" media-type "}"
                         | "{" "charset" charset "}"
                         | "{" "language"  1#language-tag "}"
                         | "{" "length" 1*DIGIT "}"
                         | "{" "features" feature-list "}"
                         | "{" "description"
                                     quoted-string [ language-tag ] "}"
                         | extension-attribute

       extension-attribute = "{" extension-name extension-value "}"
       extension-name      = token
       extension-value     = *( token | quoted-string | LWS
                              | extension-specials )

       extension-specials  =
                          <any element of tspecials except <"> and "}">

   The feature-list syntax is defined in section 6.4.

   Examples are

      {"paper.2" 0.7 {type text/html} {language fr}}

      {"paper.5" 0.9 {type text/html} {features tables}}

      {"paper.1" 0.001}

   The various attributes which can be present in a variant description
   are covered in the subsections below.  Each attribute may appear only
   once in a variant description.

5.2 URI

   The URI attribute gives the URI of the resource from which the
   variant can be retrieved with a GET request.  It can be absolute or
   relative to the Request-URI.  The variant resource may vary (on the



Holtman & Mutz                Experimental                     [Page 17]

RFC 2295            Transparent Content Negotiation           March 1998


   Cookie request header, for example), but MUST NOT engage in
   transparent content negotiation itself.

5.3 Source-quality

   The source-quality attribute gives the quality of the variant, as a
   representation of the negotiable resource, when this variant is
   rendered with a perfect rendering engine on the best possible output
   medium.

   If the source-quality is less than 1, it often expresses a quality
   degradation caused by a lossy conversion to a particular data format.
   For example, a picture originally in JPEG form would have a lower
   source quality when translated to the XBM format, and a much lower
   source quality when translated to an ASCII-art variant.  Note
   however, that degradation is a function of the source; an original
   piece of ASCII-art may degrade in quality if it is captured in JPEG
   form.

   The source-quality could also represent a level of quality caused by
   skill of language translation, or ability of the used media type to
   capture the intended artistic expression.

   Servers should use the following table a guide when assigning source
   quality values:

      1.000  perfect representation
      0.900  threshold of noticeable loss of quality
      0.800  noticeable, but acceptable quality reduction
      0.500  barely acceptable quality
      0.300  severely degraded quality
      0.000  completely degraded quality

   The same table can be used by local variant selection algorithms (see
   appendix 19) when assigning degradation factors for different content
   rendering mechanisms.  Note that most meaningful values in this table
   are close to 1.  This is due to the fact that quality factors are
   generally combined by multiplying them, not by adding them.

   When assigning source-quality values, servers should not account for
   the size of the variant and its impact on transmission and rendering
   delays; the size of the variant should be stated in the length
   attribute and any size-dependent calculations should be done by the
   variant selection algorithm.  Any constant rendering delay for a
   particular media type (for example due to the startup time of a
   helper application) should be accounted for by the user agent, when
   assigning a quality factor to that media type.




Holtman & Mutz                Experimental                     [Page 18]

RFC 2295            Transparent Content Negotiation           March 1998


5.4 Type, charset, language, and length

   The type attribute of a variant description carries the same
   information as its Content-Type response header counterpart defined
   in [1], except for any charset information, which MUST be carried in
   the charset attribute.  For, example, the header

      Content-Type: text/html; charset=ISO-8859-4

   has the counterpart attributes

      {type text/html} {charset ISO-8859-4}

   The language and length attributes carry the same information as
   their Content-* response header counterparts in [1].  The length
   attribute, if present, MUST thus reflect the length of the variant
   alone, and not the total size of the variant and any objects inlined
   or embedded by the variant.

   Though all of these attributes are optional, it is often desirable to
   include as many attributes as possible, as this will increase the
   quality of the negotiation process.

      Note: A server is not required to maintain a one-to-one
      correspondence between the attributes in the variant description
      and the Content-* headers in the variant response.  For example,
      if the variant description contains a language attribute, the
      response does not necessarily have to contain a Content-Language
      header. If a Content-Language header is present, it does not have
      to contain an exact copy of the information in the language
      attribute.

5.5 Features

   The features attribute specifies how the presence or absence of
   particular feature tags in the user agent affects the overall quality
   of the variant.  This attribute is covered in section 6.4.

5.6 Description

   The description attribute gives a textual description of the variant.
   It can be included if the URI and normal attributes of a variant are
   considered too opaque to allow interpretation by the user.  If a user
   agent is showing a menu of available variants compiled from a variant
   list, and if a variant has a description attribute, the user agent
   SHOULD show the description attribute of the variant instead of
   showing the normal attributes of the variant.  The description field
   uses the UTF-8 character encoding scheme [5], which is a superset of



Holtman & Mutz                Experimental                     [Page 19]

RFC 2295            Transparent Content Negotiation           March 1998


   US-ASCII, with ""%" HEX HEX" encoding.  The optional language tag MAY
   be used to specify the language used in the description text.

5.7 Extension-attribute

   The extension-attribute allows future specifications to incrementally
   define dimensions of negotiation which cannot be created by using the
   feature negotiation framework, and eases content negotiation
   experiments.  In experimental situations, servers MUST ONLY generate
   extension-attributes whose names start with "x-".  User agents SHOULD
   ignore all extension attributes they do not recognize.  Proxies MUST
   NOT run a remote variant selection algorithm if an unknown extension
   attribute is present in the variant list.

6  Feature negotiation

   This section defines the feature negotiation mechanism.  Feature
   negotiation has been introduced in section 4.8.  Appendix 19 contains
   examples of feature negotiation.

6.1 Feature tags

   A feature tag (ftag) identifies something which can be negotiated on,
   for example a property (feature) of a representation, a capability
   (feature) of a user agent, or the preference of a user for a
   particular type of representation.  The use of feature tags need not
   be limited to transparent content negotiation, and not every feature
   tag needs to be usable in the HTTP transparent content negotiation
   framework.

      ftag = token | quoted-string

      Note: A protocol-independent system for feature tag registration
      is currently being developed in the IETF.  This specification does
      not define any feature tags.  In experimental situations, the use
      of tags which start with "x." is encouraged.

   Feature tags are used in feature sets (section 6.2) and in feature
   predicates (section 6.3).  Feature predicates are in turn used in
   features attributes (section 6.4), which are used in variant
   descriptions (section 5).  Variant descriptions can be transmitted in
   Alternates headers (section 8.3).

   The US-ASCII charset is used for feature tags.  Feature tag
   comparison is case-insensitive.  A token tag XYZ is equal to a
   quoted-string tag "XYZ". Examples are

      tables, fonts, blebber, wolx, screenwidth, colordepth



Holtman & Mutz                Experimental                     [Page 20]

RFC 2295            Transparent Content Negotiation           March 1998


   An example of the use of feature tags in a variant description is:

      {"index.html" 1.0 {type text/html} {features tables frames}}

   This specification follows general computing practice in that it
   places no restrictions on what may be called a feature.  At the
   protocol level, this specification does not distinguish between
   different uses of feature tags: a tag will be processed in the same
   way, no matter whether it identifies a property, capability, or
   preference.  For some tags, it may be fluid whether the tag
   represents a property, preference, or capability.  For example, in
   content negotiation on web pages, a "textonly" tag would identify a
   capability of a text-only user agent, but the user of a graphical
   user agent may use this tag to specify that text-only content is
   preferred over graphical content.

6.1.1 Feature tag values

   The definition of a feature tag may state that a feature tag can have
   zero, one, or more values associated with it.  These values
   specialize the meaning of the tag.  For example, a feature tag
   `paper' could be associated with the values `A4' and `A5'.

      tag-value  = token | quoted-string

   The US-ASCII charset is used for feature tag values.  Equality
   comparison for tag values MUST be done with a case-sensitive, octet-
   by-octet comparison, where any ""%" HEX HEX" encodings MUST be
   processed as in [1].  A token value XYZ is equal to a quoted-string
   value "XYZ".

6.2 Feature sets

   The feature set of a user agent is a data structure which records the
   capabilities of the user agent and the preferences of the user.

   Feature sets are used by local variant selection algorithms (see
   appendix 19 for an example).  A user agent can use the Accept-
   Features header (section 8.2) to make some of the contents of its
   feature set known to remote variant selection algorithms.

   Structurally, a feature set is a possibly empty set, containing
   records of the form

      ( feature tag , set of feature tag values )






Holtman & Mutz                Experimental                     [Page 21]

RFC 2295            Transparent Content Negotiation           March 1998


   If a record with a feature tag is present in the set, this means that
   the user agent implements the corresponding capability, or that the
   user has expressed the corresponding preference.

   Each record in a feature set has a, possibly empty, set of tag
   values.  For feature tags which cannot have values associated with
   it, this set is always empty.  For feature tags which can have zero,
   one, or more values associated with it, this set contains those
   values currently associated with the tag.  If the set of a feature
   tag T has the value V in it, it is said that `the tag T is present
   with the value V'.

   This specification does not define a standard notation for feature
   sets.  An example of a very small feature set, in a mathematical
   notation, is

      { ( "frames" , { } ) ,
        ( "paper"  , { "A4" , "A5" } )
      }

   As feature registration is expected to be an ongoing process, it is
   generally not possible for a user agent to know the meaning of all
   feature tags it can possibly encounter in a variant description.  A
   user agent SHOULD treat all features tags unknown to it as absent
   from its feature set.

   A user agent may change the contents of its feature set depending on
   the type of request, and may also update it to reflect changing
   conditions, for example a change in the window size.  Therefore, when
   considering feature negotiation, one usually talks about `the feature
   set of the current request'.

6.3 Feature predicates

   Feature predicates are predicates on the contents of feature sets.
   They appear in the features attribute of a variant description.

      fpred = [ "!" ] ftag
            | ftag ( "=" | "!=" ) tag-value
            | ftag "=" "[" numeric-range "]"

      numeric-range = [ number ] "-" [ number ]

   Feature predicates are used in features attributes (section 6.4),
   which are used in variant descriptions (section 5).  Variant
   descriptions can be transmitted in Alternates headers (section 8.3).





Holtman & Mutz                Experimental                     [Page 22]

RFC 2295            Transparent Content Negotiation           March 1998


   Examples of feature predicates are

      blebber, !blebber, paper=a4, colordepth=5, blex!=54,
      dpi=[300-599], colordepth=[24-]

   Using the feature set of the current request, a user agent SHOULD
   compute the truth value of the different feature predicates as
   follows.

      ftag       true if the feature is present, false otherwise

      !ftag      true if the feature is absent, false otherwise

      ftag=V     true if the feature is present with the value V,
                 false otherwise,

      ftag!=V    true if the feature is not present with the value V,
                 false otherwise,

      ftag=[N-M] true if the feature is present with at least one
                 numeric value, while the highest value with which it
                 is present in the range N-M, false otherwise.  If N
                 is missing, the lower bound is 0.  If M is missing,
                 the upper bound is infinity.

   As an example, with the feature set

       { ( "blex"       , { } ),
         ( "colordepth" , { "5" } ),
         ( "UA-media"   , { "stationary" } ),
         ( "paper"      , { "A4", "A3" } ) ,
         ( "x-version"  , { "104", "200" } )
       }

   the following predicates are true:

   blex, colordepth=[4-], colordepth!=6, colordepth, !screenwidth, UA-
   media=stationary, UA-media!=screen, paper=A4, paper =!A0,
   colordepth=[ 4 - 6 ], x-version=[100-300], x-version=[200-300]

   and the following predicates are false:

      !blex, blebber, colordepth=6, colordepth=foo, !colordepth,
      screenwidth, screenwidth=640, screenwidth!=640, x-version=99, UA-
      media=screen, paper=A0, paper=a4, x-version=[100-199], wuxta






Holtman & Mutz                Experimental                     [Page 23]

RFC 2295            Transparent Content Negotiation           March 1998


6.4 Features attribute

      The features attribute, for which section 5.1 defines the syntax

      "{" "features" feature-list "}"

   is used in a variant description to specify how the presence or
   absence of particular feature tags in the user agent affects the
   overall quality of the variant.

       feature-list = 1%feature-list-element

       feature-list-element = ( fpred | fpred-bag )
                              [ ";" [ "+" true-improvement  ]
                                    [ "-" false-degradation ]
                              ]

       fpred-bag = "[" 1%fpred "]"

       true-improvement   =  short-float
       false-degradation  =  short-float

   Features attributes are used in variant descriptions (section 5).
   Variant descriptions can be transmitted in Alternates headers
   (section 8.3).

   Examples are:

       {features !textonly [blebber !wolx] colordepth=3;+0.7}

       {features !blink;-0.5 background;+1.5 [blebber !wolx];+1.4-0.8}

   The default value for the true-improvement is 1.  The default value
   for the false-degradation is 0, or 1 if a true-improvement value is
   given.

   A user agent SHOULD, and a remote variant selection algorithm MUST
   compute the quality degradation factor associated with the features
   attribute by multiplying all quality degradation factors of the
   elements of the feature-list.  Note that the result can be a factor
   greater than 1.

   A feature list element yields its true-improvement factor if the
   corresponding feature predicate is true, or if at least one element
   of the corresponding fpred-bag is true. The element yields its
   false-degradation factor otherwise.





Holtman & Mutz                Experimental                     [Page 24]

RFC 2295            Transparent Content Negotiation           March 1998


7  Remote variant selection algorithms

   A remote variant selection algorithm is a standardized algorithm by
   which a server can choose a best variant on behalf of a negotiating
   user agent.  The use of a remote algorithm can speed up the
   negotiation process by eliminating a request-response round trip.

   A remote algorithm typically computes whether the Accept- headers in
   the request contain sufficient information to allow a choice, and if
   so, which variant is the best variant.  This specification does not
   define any remote algorithms, but does define a mechanism to
   negotiate on the use of such algorithms.

7.1 Version numbers

   A version numbering scheme is used to distinguish between different
   remote variant selection algorithms.

      rvsa-version = major "." minor

      major = 1*4DIGIT
      minor = 1*4DIGIT

   An algorithm with the version number X.Y, with Y>0, MUST be downwards
   compatible with all algorithms from X.0 up to X.Y.  Downwards
   compatibility means that, if supplied with the same information, the
   newer algorithm MUST make the same choice, or a better choice, as the
   old algorithm.  There are no compatibility requirements between
   algorithms with different major version numbers.

8  Content negotiation status codes and headers

   This specification adds one new HTTP status code, and introduces six
   new HTTP headers.  It also extends the semantics of an existing
   HTTP/1.1 header.

8.1 506 Variant Also Negotiates

   The 506 status code indicates that the server has an internal
   configuration error: the chosen variant resource is configured to
   engage in transparent content negotiation itself, and is therefore
   not a proper end point in the negotiation process.









Holtman & Mutz                Experimental                     [Page 25]

RFC 2295            Transparent Content Negotiation           March 1998


8.2 Accept-Features

   The Accept-Features request header can be used by a user agent to
   give information about the presence or absence of certain features in
   the feature set of the current request.  Servers can use this
   information when running a remote variant selection algorithm.

      Note: the name `Accept-Features' for this header was chosen
      because of symmetry considerations with other Accept- headers,
      even though the Accept-Features header will generally not contain
      an exhaustive list of features which are somehow `accepted'.  A
      more accurate name of this header would have been `Feature-Set-
      Info'.

       Accept-Features = "Accept-Features" ":"
                   #( feature-expr *( ";" feature-extension ) )

       feature-expr = [ "!" ] ftag
                    | ftag ( "=" | "!=" ) tag-value
                    | ftag "=" "{" tag-value "}"
                    | "*"

       feature-extension = token [ "=" ( token | quoted-string ) ]

   No feature extensions are defined in this specification.  An example
   is:

       Accept-Features: blex, !blebber, colordepth={5}, !screenwidth,
                  paper = A4, paper!="A2", x-version=104, *

   The different feature expressions have the following meaning:

      ftag       ftag is present

      !ftag      ftag is absent

      ftag=V     ftag is present with the value V

      ftag!=V    ftag is present, but not with the value V

      ftag={V}   ftag is present with the value V, and not with any
                 other values

      *          the expressions in this header do not fully describe
                 the feature set: feature tags not mentioned in this
                 header may also be present, and, except for the case
                 ftag={V}, tags may be present with more values than
                 mentioned.



Holtman & Mutz                Experimental                     [Page 26]

RFC 2295            Transparent Content Negotiation           March 1998


   Absence of the Accept-Features header in a request is equivalent to
   the inclusion of

      Accept-Features: *

   By using the Accept-Features header, a remote variant selection
   algorithm can sometimes determine the truth value of a feature
   predicate on behalf of the user agent.  For example, with the header

       Accept-Features: blex, !blebber, colordepth={5}, !screenwidth,
                  paper = A4, paper!="A2", x-version=104, *

   the algorithm can determine that the following predicates are true:

       blex, colordepth=[4-], colordepth!=6, colordepth, !screenwidth,
       paper=A4, colordepth=[4-6]

   and that the following predicates are false:

       !blex, blebber, colordepth=6, colordepth=foo, !colordepth,
       screenwidth, screenwidth=640, screenwidth!=640,

   but the truth value of the following predicates cannot be
   determined:

       UA-media=stationary, UA-media!=screen, paper!=a0,
       x-version=[100-300], x-version=[200-300], x-version=99,
       UA-media=screen, paper=A0, paper=a4, x-version=[100-199], wuxta

8.3 Alternates

   The Alternates response header is used to convey the list of variants
   bound to a negotiable resource.  This list can also include
   directives for any content negotiation process.  If a response from a
   transparently negotiable resource includes an Alternates header, this
   header MUST contain the complete variant list bound to the negotiable
   resource.  Responses from resources which do not support transparent
   content negotiation MAY also use Alternates headers.

       Alternates = "Alternates" ":" variant-list

       variant-list = 1#( variant-description
                        | fallback-variant
                        | list-directive )

       fallback-variant = "{" <"> URI <"> "}"

       list-directive = ( "proxy-rvsa" "=" <"> 0#rvsa-version <"> )



Holtman & Mutz                Experimental                     [Page 27]

RFC 2295            Transparent Content Negotiation           March 1998


                        | extension-list-directive

       extension-list-directive =
                        token [ "=" ( token | quoted-string ) ]

   An example is

     Alternates: {"paper.1" 0.9 {type text/html} {language en}},
                 {"paper.2" 0.7 {type text/html} {language fr}},
                 {"paper.3" 1.0 {type application/postscript}
                     {language en}},
                 proxy-rvsa="1.0, 2.5"

   Any relative URI specified in a variant-description or fallback-
   variant field is relative to the request-URI.  Only one fallback-
   variant field may be present.  If the variant selection algorithm of
   the user agent finds that all described variants are unacceptable,
   then it SHOULD choose the fallback variant, if present, as the best
   variant.  If the user agent computes the overall quality values of
   the described variants, and finds that several variants share the
   highest value, then the first variant with this value in the list
   SHOULD be chosen as the best variant.

   The proxy-rvsa directive restricts the use of remote variant
   selection algorithms by proxies. If present, a proxy MUST ONLY use
   algorithms which have one of the version numbers listed, or have the
   same major version number and a higher minor version number as one of
   the versions listed.  Any restrictions set by proxy-rvsa come on top
   of the restrictions set by the user agent in the Negotiate request
   header.  The directive proxy-rvsa="" will disable variant selection
   by proxies entirely.  Clients SHOULD ignore all extension-list-
   directives they do not understand.

   A variant list may contain multiple differing descriptions of the
   same variant.  This can be convenient if the variant uses conditional
   rendering constructs, or if the variant resource returns multiple
   representations using a multipart media type.

8.4 Negotiate

   The Negotiate request header can contain directives for any content
   negotiation process initiated by the request.

      Negotiate = "Negotiate" ":" 1#negotiate-directive

      negotiate-directive = "trans"
                          | "vlist"
                          | "guess-small"



Holtman & Mutz                Experimental                     [Page 28]

RFC 2295            Transparent Content Negotiation           March 1998


                          | rvsa-version
                          | "*"
                          | negotiate-extension

      negotiate-extension = token [ "=" token ]

   Examples are

      Negotiate: 1.0, 2.5
      Negotiate: *

   The negotiate directives have the following meaning

      "trans"
        The user agent supports transparent content negotiation for
        the current request.

      "vlist"
        The user agent requests that any transparently negotiated
        response for the current request includes an Alternates
        header with the variant list bound to the negotiable resource.
        Implies "trans".

      "guess-small"
        The user agent allows origin servers to run a custom algorithm
        which guesses the best variant for the request, and to return
        this variant in a choice response, if the resulting choice
        response is smaller than or not much larger than a list
        response.  The definition of `not much larger' is left to
        origin server heuristics.  Implies "vlist" and "trans".

      rvsa-version
        The user agent allows origin servers and proxies to run the
        remote variant selection algorithm with the indicated version
        number, or with the same major version number and a higher
        minor version number.  If the algorithm has sufficient
        information to choose a best, neighboring variant, the origin
        server or proxy MAY return a choice response with this
        variant.  Implies "trans".

      "*"
        The user agent allows origin servers and proxies to run any
        remote variant selection algorithm.  The origin server may
        even run algorithms which have not been standardized.  If the
        algorithm has sufficient information to choose a best,
        neighboring variant, the origin server or proxy MAY return a
        choice response with this variant.  Implies "trans".




Holtman & Mutz                Experimental                     [Page 29]

RFC 2295            Transparent Content Negotiation           March 1998


   Servers SHOULD ignore all negotiate-directives they do not
   understand.  If the Negotiate header allows a choice between multiple
   remote variant selection algorithms which are all supported by the
   server, the server SHOULD use some internal precedence heuristics to
   select the best algorithm.

8.5 TCN

   The TCN response header is used by a server to signal that the
   resource is transparently negotiated.

       TCN = "TCN" ":" #( response-type
                        | server-side-override-directive
                        | tcn-extension )

       response-type = "list" | "choice" | "adhoc"

       server-side-override-directive = "re-choose" | "keep"

       tcn-extension = token [ "=" ( token | quoted-string ) ]

   If the resource is not transparently negotiated, a TCN header MUST
   NOT be included in any response.  If the resource is transparently
   negotiated, a TCN header, which includes the response-type value of
   the response, MUST be included in every response with a 2xx status
   code or any 3xx status code, except 304, in which it MAY be included.
   A TCN header MAY also be included, without a response-type value, in
   other responses from transparently negotiated resources.

   A server-side override directive MUST be included if the origin
   server performed a server-side override when choosing the response.
   If the directive is "re-choose", the server MUST include an
   Alternates header with the variant bound to the negotiable resource
   in the response, and user agent SHOULD use its internal variant
   selection algorithm to choose, retrieve, and display the best variant
   from this list.  If the directive is "keep" the user agent SHOULD NOT
   renegotiate on the response, but display it directly, or act on it
   directly if it is a redirection response.

   Clients SHOULD ignore all tcn-extensions they do not understand.

8.6 Variant-Vary

   The Variant-Vary response header can be used in a choice response to
   record any vary information which applies to the variant data (the
   entity body combined with some of the entity headers) contained in
   the response, rather than to the response as a whole.




Holtman & Mutz                Experimental                     [Page 30]

RFC 2295            Transparent Content Negotiation           March 1998


         Variant-Vary  = "Variant-Vary" ":" ( "*" | 1#field-name )

   Use of the Variant-Vary header is discussed in section 10.2.

9  Cache validators

   To allow for correct and efficient caching and revalidation of
   negotiated responses, this specification extends the caching model of
   HTTP/1.1 [1] in various ways.

   This specification does not introduce a `variant-list-max-age'
   directive which explicitly bounds the freshness lifetime of a cached
   variant list, like the `max-age' Cache-Control directive bounds the
   freshness lifetime of a cached response.  However, this specification
   does ensure that a variant list which is sent at a time T by the
   origin server will never be re-used without revalidation by
   semantically transparent caches after the time T+M.  This M is the
   maximum of all freshness lifetimes assigned (using max-age directives
   or Expires headers) by the origin server to

      a. the responses from the negotiable resource itself, and

      b. the responses from its neighboring variant resources

   If no freshness lifetimes are assigned by the origin server, M is the
   maximum of the freshness lifetimes which were heuristically assigned
   by all caches which can re-use the variant list.

9.1 Variant list validators

   A variant list validator is an opaque value which acts as the cache
   validator of a variant list bound to a negotiable resource.

      variant-list-validator = <quoted-string not containing any ";">

   If two responses contain the same variant list validator, a cache can
   treat the Alternates headers in these responses as equivalent (though
   the headers themselves need not be identical).

9.2 Structured entity tags

   A structured entity tag consists of a normal entity tag of which the
   opaque string is extended with a semicolon followed by the text
   (without the surrounding quotes) of a variant list validator:







Holtman & Mutz                Experimental                     [Page 31]

RFC 2295            Transparent Content Negotiation           March 1998


        normal      |  variant list  |   structured
        entity tag  |  validator     |   entity tag
       -------------+----------------+-----------------
         "etag"     |     "vlv"      |   "etag;vlv"
        W/"etag"    |     "vlv"      |  W/"etag;vlv"

   Note that a structured entity tag is itself also an entity tag.  The
   structured nature of the tag allows caching proxies capable of
   transparent content negotiation to perform some optimizations defined
   in section 10.  When not performing such optimizations, a structured
   tag SHOULD be treated as a single opaque value, according to the
   general rules in HTTP/1.1.  Examples of structured entity tags are:

      "xyzzy;1234"  W/"xyzzy;1234"  "gonkxxxx;1234"  "a;b;c;;1234"

   In the last example, the normal entity tag is "a;b;c;" and the
   variant list validator is "1234".

   If a transparently negotiated response includes an entity tag, it
   MUST be a structured entity tag.  The variant list validator in the
   structured tag MUST act as a validator for the variant list contained
   in the Alternates header.  The normal entity tag in the structured
   tag MUST act as a validator of the entity body in the response and of
   all entity headers except Alternates.

9.3 Assigning entity tags to variants

   To allow for correct revalidation of transparently negotiated
   responses by clients, origin servers SHOULD generate all normal
   entity tags for the neighboring variant resources of the negotiable
   resource in such a way that

     1. the same tag is never used by two different variants,
        unless this tag labels exactly the same entity on all occasions,

     2. if one normal tag "X" is a prefix of another normal tag "XY",
        then "Y" must never be a semicolon followed by a variant list
        validator.

10 Content negotiation responses

   If a request on a transparently negotiated resource yields a response
   with a 2xx status code or any 3xx status code except 304, this
   response MUST always be either a list response, a choice response, or
   an adhoc response.  These responses MUST always include a TCN header
   which specifies their type.  Transparently negotiated responses with
   other status codes MAY also include a TCN header.




Holtman & Mutz                Experimental                     [Page 32]

RFC 2295            Transparent Content Negotiation           March 1998


   The conditions under which the different content negotiation
   responses may be sent are defined in section 12.1 for origin servers
   and in section 13 for proxies.

   After having constructed a list, choice, or adhoc response, a server
   MAY process any If-No-Match or If-Range headers in the request
   message and shorten the response to a 304 (Not Modified) or 206
   (Partial Content) response, following the rules in the HTTP/1.1
   specification [1].  In this case, the entity tag of the shortened
   response will identify it indirectly as a list, choice, or adhoc
   response.

10.1 List response

   A list response returns the variant list of the negotiable resource,
   but no variant data.  It can be generated when the server does not
   want to, or is not allowed to, return a particular best variant for
   the request.  If the user agent supports transparent content
   negotiation, the list response will cause it to select a best variant
   and retrieve it.

   A list response MUST contain (besides the normal headers required by
   HTTP) a TCN header which specifies the "list" response-type, the
   Alternates header bound to the negotiable resource, a Vary header and
   (unless it was a HEAD request) an entity body which allows the user
   to manually select the best variant.

   An example of a list response is

     HTTP/1.1 300 Multiple Choices
     Date: Tue, 11 Jun 1996 20:02:21 GMT
     TCN: list
     Alternates: {"paper.1" 0.9 {type text/html} {language en}},
                 {"paper.2" 0.7 {type text/html} {language fr}},
                 {"paper.3" 1.0 {type application/postscript}
                     {language en}}
     Vary: negotiate, accept, accept-language
     ETag: "blah;1234"
     Cache-control: max-age=86400
     Content-Type: text/html
     Content-Length: 227

     <h2>Multiple Choices:</h2>
     <ul>
     <li><a href=paper.1>HTML, English version</a>
     <li><a href=paper.2>HTML, French version</a>
     <li><a href=paper.3>Postscript, English version</a>
     </ul>



Holtman & Mutz                Experimental                     [Page 33]

RFC 2295            Transparent Content Negotiation           March 1998


      Note: A list response can have any status code, but the 300
      (Multiple Choices) code is the most appropriate one for HTTP/1.1
      clients.  Some existing versions of HTTP/1.0 clients are known to
      silently ignore 300 responses, instead of handling them according
      to the HTTP/1.0 specification [2].  Servers should therefore be
      careful in sending 300 responses to non-negotiating HTTP/1.0 user
      agents, and in making these responses cacheable.  The 200 (OK)
      status code can be used instead.

   The Vary header in the response SHOULD ensure correct handling by
   plain HTTP/1.1 caching proxies.  This header can either be

      Vary: *

   or a more elaborate header; see section 10.6.1.

   Only the origin server may construct list responses.  Depending on
   the status code, a list response is cacheable unless indicated
   otherwise.

   According to the HTTP/1.1 specification [1], a user agent which does
   not support transparent content negotiation will, when receiving a
   list response with the 300 status code, display the entity body
   included in the response.  If the response contains a Location
   header, however, the user agent MAY automatically redirect to this
   location.

   The handling of list responses by clients supporting transparent
   content negotiation is described in sections 11.1 and 13.

10.2 Choice response

   A choice response returns a representation of the best variant for
   the request, and may also return the variant list of the negotiable
   resource.  It can be generated when the server has sufficient
   information to be able to choose the best variant on behalf the user
   agent, but may only be generated if this best variant is a
   neighboring variant.  For request from user agents which do not
   support transparent content negotiation, a server may always generate
   a choice response, provided that the variant returned is a
   neighboring variant.  The variant returned in a choice response need
   not necessarily be listed in the variant list bound to the negotiable
   resource.








Holtman & Mutz                Experimental                     [Page 34]

RFC 2295            Transparent Content Negotiation           March 1998


   A choice response merges a normal HTTP response from the chosen
   variant, a TCN header which specifies the "choice" response-type, and
   a Content-Location header giving the location of the variant.
   Depending on the status code, a choice response is cacheable unless
   indicated otherwise.

   Origin servers and proxy caches MUST construct choice responses with
   the following algorithm (or any other algorithm which gives equal end
   results for the client).

   In this algorithm, `the current Alternates header' refers to the
   Alternates header containing the variant list which was used to
   choose the best variant, and `the current variant list validator'
   refers to the validator of this list.  Section 10.4 specifies how
   these two items can be obtained by a proxy cache.

   The algorithm consists of four steps.

     1. Construct a HTTP request message on the best variant resource
        by rewriting the request-URI and Host header (if appropriate) of
        the received request message on the negotiable resource.

     2. Generate a valid HTTP response message, but not one with the
        304 (Not Modified) code, for the request message constructed in
        step 1.

        In a proxy cache, the response can be obtained from cache
        memory, or by passing the constructed HTTP request towards the
        origin server.  If the request is passed on, the proxy MAY add,
        modify, or delete If-None-Match and If-Range headers to optimize
        the transaction with the upstream server.

           Note: the proxy should be careful not to add entity tags of
           non-neighboring variants to If-* (conditional) headers of the
           request, as there are no global uniqueness requirements for
           these tags.

     3. Only in origin servers: check for an origin server
        configuration error. If the HTTP response message generated in
        step 2 contains a TCN header, then the best variant resource is
        not a proper end point in the transparent negotiation process,
        and a 506 (Variant Also Negotiates) error response message
        SHOULD be generated instead of going to step 4.

     4. Add a number of headers to the HTTP response message generated
        in step 2.





Holtman & Mutz                Experimental                     [Page 35]

RFC 2295            Transparent Content Negotiation           March 1998


        a. Add a TCN header which specifies the "choice"
           response-type.

        b. Add a Content-Location header giving the location of the
           chosen variant.  Delete any Content-Location header which was
           already present.

              Note: According to the HTTP/1.1 specification [1], if the
              Content-Location header contains a relative URI, this URI
              is relative to the URI in the Content-Base header, if
              present, and relative to the request-URI if no Content-
              Base header is present.

        c. If any Vary headers are present in the response message
           from step 2, add, for every Vary header, a Variant-Vary
           header with a copy of the contents of this Vary header.

        d. Delete any Alternates headers which are present in in the
           response.  Now, the current Alternates header MUST be added
           if this is required by the Negotiate request header, or if
           the server returns "re-choose" in the TCN response header.
           Otherwise, the current Alternates header MAY be added.

              Note: It is usually a good strategy to always add the
              current Alternates header, unless it is very large
              compared to the rest of the response.

        e. Add a Vary header to ensure correct handling by plain
           HTTP/1.1 caching proxies.  This header can either be

              Vary: *
           or a more elaborate header, see section 10.6.

        f. To ensure compatibility with HTTP/1.0 caching proxies which
           do not recognize the Vary header, an Expires header with a
           date in the past MAY be added. See section 10.7 for more
           information.

        g. If an ETag header is present in the response message from
           step 2, then extend the entity tag in that header with the
           current variant list validator, as specified in section 9.2.

              Note: Step g. is required even if the variant list itself
              is not added in step d.

        h. Only in proxy caches: set the Age header of the response to

              max( variant_age , alternates_age )



Holtman & Mutz                Experimental                     [Page 36]

RFC 2295            Transparent Content Negotiation           March 1998


           where variant_age is the age of the variant response obtained
           in step 2, calculated according to the rules in the HTTP/1.1
           specification [1], and alternates_age is the age of the
           Alternates header added in step d, calculated according to
           the rules in section 10.4.

   Note that a server can shorten the response produced by the above
   algorithm to a 304 (Not Modified) response if an If-None-Match header
   in the original request allows it.  If this is the case, an
   implementation of the above algorithm can avoid the unnecessary
   internal construction of full response message in step 2, it need
   only construct the parts which end up in the final 304 response.  A
   proxy cache which implements this optimization can sometimes generate
   a legal 304 response even if it has not cached the variant data
   itself.

   An example of a choice response is:

     HTTP/1.1 200 OK
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     TCN: choice
     Content-Type: text/html
     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
     Content-Length: 5327
     Cache-control: max-age=604800
     Content-Location: paper.1
     Alternates: {"paper.1" 0.9 {type text/html} {language en}},
                 {"paper.2" 0.7 {type text/html} {language fr}},
                 {"paper.3" 1.0 {type application/postscript}
                     {language en}}
     Etag: "gonkyyyy;1234"
     Vary: negotiate, accept, accept-language
     Expires: Thu, 01 Jan 1980 00:00:00 GMT

     <title>A paper about ....

10.3 Adhoc response

   An adhoc response can be sent by an origin server as an extreme
   measure, to achieve compatibility with a non-negotiating or buggy
   client if this compatibility cannot be achieved by sending a list or
   choice response.  There are very little requirements on the contents
   of an adhoc response.  An adhoc response MUST have a TCN header which
   specifies the "adhoc" response-type, and a Vary header if the
   response is cacheable.  It MAY contain the Alternates header bound to
   the negotiable resource.





Holtman & Mutz                Experimental                     [Page 37]

RFC 2295            Transparent Content Negotiation           March 1998


   Any Vary header in the response SHOULD ensure correct handling by
   plain HTTP/1.1 caching proxies.  This header can either be

        Vary: *

   or a more elaborate header, see section 10.6.1.  Depending on the
   status code, an adhoc response is cacheable unless indicated
   otherwise.

   As an example of the use of an adhoc response, suppose that the
   variant resource "redirect-to-blah" yields redirection (302)
   responses.  A choice response with this variant could look as
   follows:

     HTTP/1.1 302 Moved Temporarily
     Date: Tue, 11 Jun 1996 20:02:28 GMT
     TCN: choice
     Content-location: redirect-to-blah
     Location: http://blah.org/
     Content-Type: text/html
     Content-Length: 62

     This document is available <a href=http://blah.org/>here</a>.

   Suppose that the server knows that the receiving user agent has a
   bug, which causes it to crash on responses which contain both a
   Content-Location and a Location header.  The server could then work
   around this bug by performing a server-side override and sending the
   following adhoc response instead:

        HTTP/1.1 302 Moved Temporarily
        Date: Tue, 11 Jun 1996 20:02:28 GMT
        TCN: adhoc, keep
        Location: http://blah.org/
        Content-Type: text/html
        Content-Length: 62

        This document is available <a href=http://blah.org/>here</a>.

10.4 Reusing the Alternates header

   If a proxy cache has available a negotiated response which is
   cacheable, fresh, and has ETag and Alternates headers, then it MAY
   extract the Alternates header and associated variant list validator
   from the response, and reuse them (without unnecessary delay) to






Holtman & Mutz                Experimental                     [Page 38]

RFC 2295            Transparent Content Negotiation           March 1998


   negotiate on behalf of the user agent (section 13) or to construct a
   choice response (section 10.2).  The age of the extracted Alternates
   header is the age of the response from which it is extracted,
   calculated according to the rules in the HTTP/1.1 specification [1].

10.5 Extracting a normal response from a choice response

   If a proxy receives a choice response, it MAY extract and cache the
   normal HTTP response contained therein.  The normal response can be
   extracted by taking a copy of the choice response and then deleting
   any Content-Location, Alternates, and Vary headers, renaming any
   Variant-Vary headers to Vary headers, and shortening the structured
   entity tag in any ETag header to a normal entity tag.

   This normal response MAY be cached (as a HTTP response to the variant
   request as constructed in step 1. of section 10.2) and reused to
   answer future direct requests on the variant resource, according to
   the rules in the HTTP/1.1 specification [1].

      Note: The caching of extracted responses can decrease the upstream
      bandwidth usage with up to a factor 2, because two independent
      HTTP/1.1 cache entries, one associated with the negotiable
      resource URI and one with the variant URI, are created in the same
      transaction.  Without this optimization, both HTTP/1.1 cache
      entries can only be created by transmitting the variant data
      twice.

   For security reasons (see section 14.2), an extracted normal response
   MUST NEVER be cached if belongs to a non-neighboring variant
   resource.  If the choice response claims to contain data for a non-
   neighboring variant resource, the proxy SHOULD reject the choice
   response as a probable spoofing attempt.

10.6 Elaborate Vary headers

   If a HTTP/1.1 [1] server can generate varying responses for a request
   on some resource, then the server MUST include a Vary header in these
   responses if they are cacheable.  This Vary header is a signal to
   HTTP/1.1 caches that something special is going on.  It prevents the
   caches from returning the currently chosen response for every future
   request on the resource.

   Servers engaging in transparent content negotiation will generate
   varying responses.  Therefore, cacheable list, choice, and adhoc
   responses MUST always include a Vary header.






Holtman & Mutz                Experimental                     [Page 39]

RFC 2295            Transparent Content Negotiation           March 1998


   The most simple Vary header which can be included is

       Vary: *

   This header leaves the way in which the response is selected by the
   server completely unspecified.

   A more elaborate Vary header MAY be used to allow for certain
   optimizations in HTTP/1.1 caches which do not have specific
   optimizations for transparent content negotiation, but which do cache
   multiple variant responses for one resource.  Such a more elaborate
   Vary header lists all request headers which can be used by the server
   when selecting a response for a request on the resource.

10.6.1 Construction of an elaborate Vary header

   Origin servers can construct a more elaborate Vary header in the
   following way.  First, start with the header

       Vary: negotiate

   `negotiate' is always included because servers use the information in
   the Negotiate header when choosing between a list, choice, or adhoc
   response.

   Then, if any of the following attributes is present in any variant
   description in the Alternates header, add the corresponding header
   name to the Vary header

         attribute  |   header name to add
         -----------+---------------------
          type      |   accept
          charset   |   accept-charset
          language  |   accept-language
          features  |   accept-features


   The Vary header constructed in this way specifies the response
   variation which can be caused by the use of a variant selection
   algorithm in proxies.  If the origin server will in some cases, for
   example if contacted by a non-negotiating user agent, use a custom
   negotiation algorithm which takes additional headers into account,
   these names of these headers SHOULD also be added to the Vary header.








Holtman & Mutz                Experimental                     [Page 40]

RFC 2295            Transparent Content Negotiation           March 1998


10.6.2 Caching of an elaborate Vary header

   A proxy cache cannot construct an elaborate vary header using the
   method above, because this method requires exact knowledge of any
   custom algorithms present in the origin server.  However, when
   extracting an Alternates header from a response (section 10.4) caches
   MAY also extract the Vary header in the response, and reuse it along
   with the Alternates header.  A clean Vary header can however only be
   extracted if the variant does not vary itself, i.e. if a Variant-Vary
   header is absent.

10.7 Adding an Expires header for HTTP/1.0 compatibility

   To ensure compatibility with HTTP/1.0 caching proxies which do not
   recognize the Vary header, an Expires header with a date in the past
   can be added to the response, for example

        Expires: Thu, 01 Jan 1980 00:00:00 GMT

   If this is done by an origin server, the server SHOULD usually also
   include a Cache-Control header for the benefit of HTTP/1.1 caches,
   for example

              Cache-Control: max-age=604800

   which overrides the freshness lifetime of zero seconds specified by
   the included Expires header.

      Note: This specification only claims downwards compatibility with
      the HTTP/1.0 proxy caches which implement the HTTP/1.0
      specification [2].  Some legacy proxy caches which return the
      HTTP/1.0 protocol version number do not honor the HTTP/1.0 Expires
      header as specified in [2].  Methods for achieving compatibility
      with such proxy caches are beyond the scope of this specification.

10.8 Negotiation on content encoding

   Negotiation on the content encoding of a response is orthogonal to
   transparent content negotiation.  The rules for when a content
   encoding may be applied are the same as in HTTP/1.1: servers MAY
   content-encode responses that are the result of transparent content
   negotiation whenever an Accept-Encoding header in the request allows
   it.  When negotiating on the content encoding of a cacheable
   response, servers MUST add the accept-encoding header name to the
   Vary header of the response, or add `Vary: *'.






Holtman & Mutz                Experimental                     [Page 41]

RFC 2295            Transparent Content Negotiation           March 1998


   Servers SHOULD always be able to provide unencoded versions of every
   transparently negotiated response.  This means in particular that
   every variant in the variant list SHOULD at least be available in an
   unencoded form.

   Like HTTP/1.1, this specification allows proxies to encode or decode
   relayed or cached responses on the fly, unless explicitly forbidden
   by a Cache-Control directive.  The encoded or decoded response still
   contains the same variant as far as transparent content negotiation
   is concerned.  Note that HTTP/1.1 requires proxies to add a Warning
   header if the encoding of a response is changed.

11 User agent support for transparent negotiation

   This section specifies the requirements a user agent needs to satisfy
   in order to support transparent negotiation.  If the user agent
   contains an internal cache, this cache MUST conform to the rules for
   proxy caches in section 13.

11.1 Handling of responses

   If a list response is received when a resource is accessed, the user
   agent MUST be able to automatically choose, retrieve, and display the
   best variant, or display an error message if none of the variants are
   acceptable.

   If a choice response is received when a resource is accessed, the
   usual action is to automatically display the enclosed entity.
   However, if a remote variant selection algorithm which was enabled
   could have made a choice different from the choice the local
   algorithm would make, the user agent MAY apply its local algorithm to
   any variant list in the response, and automatically retrieve and
   display another variant if the local algorithm makes an other choice.

   When receiving a choice response, a user agent SHOULD check if
   variant resource is a neighboring variant resource of the negotiable
   resource.  If this is not the case, the user agent SHOULD reject the
   choice response as a probable spoofing attempt and display an error
   message, for example by internally replacing the choice response with
   a 502 (bad gateway) response.

11.2 Presentation of a transparently negotiated resource

   If the user agent is displaying a variant which is not an embedded or
   inlined object and which is the result of transparent content
   negotiation, the following requirements apply.





Holtman & Mutz                Experimental                     [Page 42]

RFC 2295            Transparent Content Negotiation           March 1998


    1. The user agent SHOULD allow the user to review a list of all
       variants bound to the negotiable resource, and to manually
       retrieve another variant if desired.  There are two general ways
       of providing such a list.  First, the information in the
       Alternates header of the negotiable resource could be used to
       make an annotated menu of variants.  Second, the entity included
       in a list response of the negotiable resource could be displayed.
       Note that a list response can be obtained by doing a GET request
       which only has the "trans" directive in the Negotiate header.

    2. The user agent SHOULD make available though its user interface
       some indication that the resource being displayed is a negotiated
       resource instead of a plain resource.  It SHOULD also allow the
       user to examine the variant list included in the Alternates
       header.  Such a notification and review mechanism is needed
       because of privacy considerations, see section 14.1.

    3. If the user agent shows the URI of the displayed information to
       the user, it SHOULD be the negotiable resource URI, not the
       variant URI that is shown.  This encourages third parties, who
       want to refer to the displayed information in their own
       documents, to make a hyperlink to the negotiable resource as a
       whole, rather than to the variant resource which happens to be
       shown.  Such correct linking is vital for the interoperability of
       content across sites.  The user agent SHOULD however also provide
       a means for reviewing the URI of the particular variant which is
       currently being displayed.

    4. Similarly, if the user agent stores a reference to the
       displayed information for future use, for example in a hotlist,
       it SHOULD store the negotiable resource URI, not the variant URI.

   It is encouraged, but not required, that some of the above
   functionality is also made available for inlined or embedded objects,
   and when a variant which was selected manually is being displayed.

12 Origin server support for transparent negotiation

12.1 Requirements

   To implement transparent negotiation on a resource, the origin server
   MUST be able to send a list response when getting a GET request on
   the resource.  It SHOULD also be able to send appropriate list
   responses for HEAD requests.  When getting a request on a
   transparently negotiable resource, the origin server MUST NEVER
   return a response with a 2xx status code or any 3xx status code,
   except 304, which is not a list, choice, or adhoc response.




Holtman & Mutz                Experimental                     [Page 43]

RFC 2295            Transparent Content Negotiation           March 1998


   If the request includes a Negotiate header with a "vlist" or "trans"
   directive, but without any directive which allows the server to
   select a best variant, a list response MUST ALWAYS be sent, except
   when the server is performing a server-side override for bug
   compatibility.  If the request includes a Negotiate header with a
   "vlist" or "guess-small" directive, an Alternates header with the
   variant list bound to the negotiable resource MUST ALWAYS be sent in
   any list, choice, or adhoc response, except when the server is
   performing a server-side override for bug compatibility.

   If the Negotiate header allows it, the origin server MAY run a remote
   variant selection algorithm.  If the algorithm has sufficient
   information to choose a best variant, and if the best variant is a
   neighboring variant, the origin server MAY return a choice response
   with this variant.

   When getting a request on a transparently negotiable resource from a
   user agent which does not support transparent content negotiation,
   the origin server MAY use a custom algorithm to select between
   sending a list, choice, or adhoc response.

   The following table summarizes the rules above.

     |Req on   |Usr agnt|server-  |         Response may be:         |
     |trans neg|capable |side     +------+------+------+------+------+
     |resource?|of TCN? |override?|list  |choice|adhoc |normal|error |
     +---------+--------+---------+------+------+------+------+------+
     |   Yes   |  Yes   |  No     |always|smt(*)|never |never |always|
     +---------+--------+---------+------+------+------+------+------+
     |   Yes   |  Yes   |  Yes    |always|always|always|never |always|
     +---------+--------+---------+------+------+------+------+------+
     |   Yes   |  No    |   -     |always|always|always|never |always|
     +---------+--------+---------+------+------+------+------+------+
     |   No    |   -    |   -     |never |never |never |always|always|
     +---------+--------+---------+------+------+------+------+------+
        (*) sometimes, when allowed by the Negotiate request header

   Negotiability is a binary property: a resource is either
   transparently negotiated, or it is not.  Origin servers SHOULD NOT
   vary the negotiability of a resource, or the variant list bound to
   that resource, based on the request headers which are received.  The
   variant list and the property of being negotiated MAY however change
   through time.  The Cache-Control header can be used to control the
   propagation of such time-dependent changes through caches.

   It is the responsibility of the author of the negotiable resource to
   ensure that all resources in the variant list serve the intended
   content, and that the variant resources do not engage in transparent



Holtman & Mutz                Experimental                     [Page 44]

RFC 2295            Transparent Content Negotiation           March 1998


   content negotiation themselves.

12.2 Negotiation on transactions other than GET and HEAD

   If a resource is transparently negotiable, this only has an impact on
   the GET and HEAD transactions on the resource.  It is not possible
   (under this specification) to do transparent content negotiation on
   the direct result of a POST request.

   However, a POST request can return an unnegotiated 303 (See Other)
   response which causes the user agent to do a GET request on a second
   resource.  This second resource could then use transparent content
   negotiation to return an appropriate final response.  The figure
   below illustrates this.

      Server ______ proxy ______ proxy ______ user
      x.org         cache        cache        agent

        < -------------------------------------
        |     POST http://x.org/cgi/submit
        |     <form contents in request body>
        |
        -------------------------------------- >
              303 See Other                    |
              Location: http://x.org/result/OK |
                                               |
        < -------------------------------------
        |     GET http://x.org/result/OK
        |      small Accept- headers
        |
      able to choose on
      behalf of user agent
        |
         ------------------------------------- >
              choice response with             |
              ..result/OK.nl variant           |
                                           displays OK.nl

   See the HTTP/1.1 specification [1] for details on the 303 (See Other)
   status code.  Note that this status code is not understood by some
   HTTP/1.0 clients.

13 Proxy support for transparent negotiation

   Transparent content negotiation is an extension on top of HTTP/1.x.
   It is designed to work through any proxy which only implements the
   HTTP/1.1 specification [1].  If Expires headers are added as
   discussed in section 10.7, negotiation will also work though proxies



Holtman & Mutz                Experimental                     [Page 45]

RFC 2295            Transparent Content Negotiation           March 1998


   which implement HTTP/1.0 [2].  Thus, every HTTP/1.0 or HTTP/1.1 proxy
   provides support for transparent content negotiation.  However, if it
   is to be claimed that a HTTP/1.x proxy offers transparent content
   negotiation services, at least one of the specific optimizations
   below MUST be implemented.

   An HTTP/1.x proxy MUST ONLY optimize (change) the HTTP traffic
   flowing through it in ways which are explicitly allowed by the
   specification(s) it conforms to.  A proxy which supports transparent
   content negotiation on top of HTTP/1.x MAY perform the optimizations
   allowed for by HTTP/1.x.  In addition, it MAY perform three
   additional optimizations, defined below, on the HTTP traffic for
   transparently negotiated resources and their neighboring variant
   resources.

   First, when getting a request on a transparently negotiable resource
   from a user agent which supports transparent content negotiation, the
   proxy MAY return any cached, fresh list response from that resource,
   even if the selecting request headers, as specified by the Vary
   header, do not match.

   Second, when allowed by the user agent and origin server, a proxy MAY
   reuse an Alternates header taken from a previous response (section
   10.4) to run a remote variant selection algorithm.  If the algorithm
   has sufficient information to choose a best variant, and if the best
   variant is a neighboring variant, the proxy MAY return a choice
   response with this variant.

   Third, if a proxy receives a choice response, it MAY extract and
   cache the normal response embedded therein, as described in section
   10.5.

14 Security and privacy considerations

14.1 Accept- headers revealing personal information

   Accept- headers, in particular Accept-Language headers, may reveal
   information which the user would rather keep private unless it will
   directly improve the quality of service.  For example, a user may not
   want to send language preferences to sites which do not offer multi-
   lingual content.  The transparent content negotiation mechanism
   allows user agents to omit sending of the Accept-Language header by
   default, without adversely affecting the outcome of the negotiation
   process if transparently negotiated multi-lingual content is
   accessed.






Holtman & Mutz                Experimental                     [Page 46]

RFC 2295            Transparent Content Negotiation           March 1998


   However, even if Accept- headers are never sent, the automatic
   selection and retrieval of a variant by a user agent will reveal a
   preference for this variant to the server.  A malicious service
   author could provide a page with `fake' negotiability on (ethnicity-
   correlated) languages, with all variants actually being the same
   English document, as a means of obtaining privacy-sensitive
   information.  Such a plot would however be visible to an alert victim
   if the list of available variants and their properties is reviewed.

   Some additional privacy considerations connected to Accept- headers
   are discussed in [1].

14.2 Spoofing of responses from variant resources

   The caching optimization in section 10.5 gives the implementer of a
   negotiable resource control over the responses cached for all
   neighboring variant resources.  This is a security problem if a
   neighboring variant resource belongs to another author.  To provide
   security in this case, the HTTP server will have to filter the
   Content-Location headers in the choice responses generated by the
   negotiable resource implementation.

14.3 Security holes revealed by negotiation

   Malicious servers could use transparent content negotiation as a
   means of obtaining information about security holes which may be
   present in user agents.  This is a risk in particular for negotiation
   on the availability of scripting languages and libraries.

15 Internationalization considerations

   This protocol defines negotiation facilities which can be used for
   the internationalization of web content.  For the
   internationalization of list response bodies (section 10.1), HTTP/1.0
   style negotiation (section 4.2) can be used.

16 Acknowledgments

   Work on HTTP content negotiation has been done since at least 1993.
   The authors are unable to trace the origin of many of the ideas
   incorporated in this document.  Many members of the HTTP working
   group have contributed to the negotiation model in this
   specification.  The authors wish to thank the individuals who have
   commented on earlier versions of this document, including Brian
   Behlendorf, Daniel DuBois, Martin J. Duerst, Roy T. Fielding, Jim
   Gettys, Yaron Goland, Dirk van Gulik, Ted Hardie, Graham Klyne, Scott
   Lawrence, Larry Masinter, Jeffrey Mogul, Henrik Frystyk Nielsen,
   Frederick G.M. Roeber, Paul Sutton, and Klaus Weide and Mark Wood.



Holtman & Mutz                Experimental                     [Page 47]

RFC 2295            Transparent Content Negotiation           March 1998


17 References

   [1] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., and
       T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC
       2068, January 1997.

   [2] Berners-Lee, T., Fielding, R., and H. Frystyk, "Hypertext
       Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996.

   [3] Holtman, K., and A. Mutz, "HTTP Remote Variant Selection
       Algorithm -- RVSA/1.0", RFC 2296, March 1998.

   [4] Bradner, S., "Key words for use in RFCs to Indicate Requirement
       Levels", BCP 14, RFC 2119, March 1997.

   [5] Yergeau, F., "UTF-8, a transformation format of Unicode and ISO
       10646", RFC 2044, October 1996.

18 Authors' Addresses

   Koen Holtman
   Technische Universiteit Eindhoven
   Postbus 513
   Kamer HG 6.57
   5600 MB Eindhoven (The Netherlands)

   EMail: koen@win.tue.nl


   Andrew H. Mutz
   Hewlett-Packard Company
   1501 Page Mill Road 3U-3
   Palo Alto CA 94304, USA

   Fax +1 415 857 4691
   EMail: mutz@hpl.hp.com















Holtman & Mutz                Experimental                     [Page 48]

RFC 2295            Transparent Content Negotiation           March 1998


19 Appendix: Example of a local variant selection algorithm

   A negotiating user agent will choose the best variant from a variant
   list with a local variant selection algorithm.  This appendix
   contains an example of such an algorithm.

   The inputs of the algorithm are a variant list from an Alternates
   header, and an agent-side configuration database, which contains

     - the feature set of the current request,

     - a collection of quality values assigned to media types,
       languages, and charsets for the current request, following the
       model of the corresponding HTTP/1.1 [1] Accept- headers,

     - a table which lists `forbidden' combinations of media types and
       charsets, i.e. combinations which cannot be displayed because of
       some internal user agent limitation.

   The output of the algorithm is either the best variant, or the
   conclusion that none of the variants are acceptable.

19.1 Computing overall quality values

   As a first step in the local variant selection algorithm, the overall
   qualities associated with all variant descriptions in the list are
   computed.

   The overall quality Q of a variant description is the value

      Q = round5( qs * qt * qc * ql * qf * qa )

   where rounds5 is a function which rounds a floating point value to 5
   decimal places after the point.  It is assumed that the user agent
   can run on multiple platforms: the rounding function makes the
   algorithm independent of the exact characteristics of the underlying
   floating point hardware.

   The factors qs, qt, qc, ql, qf, and qa are determined as follows.

      qs Is the source quality factor in the variant description.

      qt The media type quality factor is 1 if there is no type
         attribute in the variant description.  Otherwise, it is the
         quality value assigned to this type by the configuration
         database.  If the database does not assign a value, then the
         factor is 0.




Holtman & Mutz                Experimental                     [Page 49]

RFC 2295            Transparent Content Negotiation           March 1998


      qc The charset quality factor is 1 if there is no charset
         attribute in the variant description.  Otherwise, it is the
         quality value assigned to this charset by the configuration
         database.  If the database does not assign a value, then the
         factor is 0.

      ql The language quality factor is 1 if there is no language
         attribute in the variant description.  Otherwise, it is the
         highest quality value the configuration database assigns to any
         of the languages listed in the language attribute.  If the
         database does not assign a value to any of the languages
         listed, then the factor is 0.

      qf The features quality factor is 1 if there is no features
         attribute in the variant description.  Otherwise, it is the
         quality degradation factor computed for the features attribute
         using the feature set of the current request.

      qa The quality adjustment factor is 0 if the variant description
         lists a media type - charset combination which is `forbidden'
         by the table, and 1 otherwise.

   As an example, if a variant list contains the variant description

     {"paper.2" 0.7 {type text/html} {language fr}}

   and if the configuration database contains the quality value
   assignments

     types:     text/html;q=1.0, type application/postscript;q=0.8
     languages: en;q=1.0, fr;q=0.5

   then the local variant selection algorithm will compute the overall
   quality for the variant description as follows:

     {"paper.2" 0.7 {type text/html} {language fr}}
                 |           |                 |
                 |           |                 |
                 V           V                 V
       round5 ( 0.7   *     1.0        *      0.5 ) = 0.35000

   With same configuration database, the variant list

     {"paper.1" 0.9 {type text/html} {language en}},
     {"paper.2" 0.7 {type text/html} {language fr}},
     {"paper.3" 1.0 {type application/postscript} {language en}}

   would yield the following computations:



Holtman & Mutz                Experimental                     [Page 50]

RFC 2295            Transparent Content Negotiation           March 1998


       round5 ( qs  * qt  * qc  * ql  * qf  * qa ) = Q
                ---   ---   ---   ---   ---   ---
      paper.1:  0.9 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0  = 0.90000
      paper.1:  0.7 * 1.0 * 1.0 * 0.5 * 1.0 * 1.0  = 0.35000
      paper.3:  1.0 * 0.8 * 1.0 * 1.0 * 1.0 * 1.0  = 0.80000

19.2 Determining the result

   Using all computed overall quality values, the end result of the
   local variant selection algorithm is determined as follows.

   If all overall quality values are 0, then the best variant is the
   fallback variant, if there is one in the list, else the result is the
   conclusion that none of the variants are acceptable.

   If at least one overall quality value is greater than 0, then the
   best variant is the variant which has the description with the
   highest overall quality value, or, if there are multiple variant
   descriptions which share the highest overall quality value, the
   variant of the first variant description in the list which has this
   highest overall quality value.

19.3 Ranking dimensions

   Consider the following variant list:

     {"paper.greek"   1.0 {language el} {charset ISO-8859-7}},
     {"paper.english" 1.0 {language en} {charset ISO-8859-1}}

   It could be the case that the user prefers the language "el" over
   "en", while the user agent can render "ISO-8859-1" better than "ISO-
   8859-7".  The result is that in the language dimension, the first
   variant is best, while the second variant is best in the charset
   dimension.  In this situation, it would be preferable to choose the
   first variant as the best variant: the user settings in the language
   dimension should take precedence over the hard-coded values in the
   charset dimension.

   To express this ranking between dimensions, the user agent
   configuration database should have a higher spread in the quality
   values for the language dimension than for the charset dimension.
   For example, with

     languages: el;q=1.0, en-gb;q=0.7, en;q=0.6, da;q=0, ...

     charsets:  ISO-8859-1;q=1.0, ISO-8859-7;q=0.95,
                ISO-8859-5;q=0.97, unicode-1-1;q=0, ...




Holtman & Mutz                Experimental                     [Page 51]

RFC 2295            Transparent Content Negotiation           March 1998


   the first variant will have an overall quality of 0.95000, while the
   second variant will have an overall quality 0.70000.  This makes the
   first variant the best variant.

20 Appendix: feature negotiation examples

   This appendix contains examples of the use of feature tags in variant
   descriptions.  The tag names used here are examples only, they do not
   in general reflect the tag naming scheme proposed in [4].

20.1 Use of feature tags

   Feature tags can be used in variant lists to express the quality
   degradation associated with the presence or absence of certain
   features.  One example is

     {"index.html.plain" 0.7 },
     {"index.html"       1.0 {features tables frames}}

   Here, the "{features tables frames}" part expresses that index.html
   uses the features tagged as tables and frames.  If these features are
   absent, the overall quality of index.html degrades to 0.  Another
   example is

     {"home.graphics" 1.0 {features !textonly}},
     {"home.textonly" 0.7 }

   where the "{features !textonly}" part expresses that home.graphics
   requires the absence of the textonly feature.  If the feature is
   present, the overall quality of home.graphics degrades to 0.

   The absence of a feature need not always degrade the overall quality
   to 0.  In the example

     {"x.html.1" 1.0 {features fonts;-0.7}}

   the absence of the fonts feature degrades the quality with a factor
   of 0.7.  Finally, in the example

      {"y.html" 1.0 {features [blebber wolx] }}

   The "[blebber wolx]" expresses that y.html requires the presence of
   the blebber feature or the wolx feature.  This construct can be used
   in a number of cases:

     1. blebber and wolx actually tag the same feature, but they were
        registered by different people, and some user agents say they
        support blebber while others say they support wolx.



Holtman & Mutz                Experimental                     [Page 52]

RFC 2295            Transparent Content Negotiation           March 1998


     2. blebber and wolx are HTML tags of different vendors which
        implement the same functionality, and which are used together in
        y.html without interference.

     3. blebber and wolx are HTML tags of different vendors which
        implement the same functionality, and y.html uses the tags in a
        conditional HTML construct.

     4. blebber is a complicated HTML tag with only a sketchy
        definition, implemented by one user agent vendor, and wolx
        indicates implementation of a well-defined subset of the blebber
        tag by some other vendor(s).  y.html uses only this well-defined
        subset.

20.2 Use of numeric feature tags

   As an example of negotiation in a numeric area, the following variant
   list describes four variants with title graphics designed for
   increasing screen widths:

     {"home.pda"    1.0 {features screenwidth=[-199] }},
     {"home.narrow" 1.0 {features screenwidth=[200-599] }},
     {"home.normal" 1.0 {features screenwidth=[600-999] }},
     {"home.wide"   1.0 {features screenwidth=[1000-] }},
     {"home.normal"}

   The last element of the list specifies a safe default for user agents
   which do not implement screen width negotiation.  Such user agents
   will reject the first four variants as unusable, as they seem to rely
   on a feature which they do not understand.

20.3 Feature tag design

   When designing a new feature tag, it is important to take into
   account that existing user agents, which do not recognize the new tag
   will treat the feature as absent.  In general, a new feature tag
   needs to be designed in such a way that absence of the tag is the
   default case which reflects current practice.  If this design
   principle is ignored, the resulting feature tag will generally be
   unusable.

   As an example, one could try to support negotiation between
   monochrome and color content by introducing a `color' feature tag,
   the presence of which would indicate the capability to display color
   graphics.  However, if this new tag is used in a variant list, for
   example

      {"rainbow.gif"      1.0 {features color} }



Holtman & Mutz                Experimental                     [Page 53]

RFC 2295            Transparent Content Negotiation           March 1998


      {"rainbow.mono.gif" 0.6 {features !color}}

   then existing user agents, which would not recognize the color tag,
   would all display the monochrome rainbow.  The color tag is therefore
   unusable in situations where optimal results for existing user agents
   are desired.  To provide for negotiation in this area, one must
   introduce a `monochrome' feature tag; its presence indicates that the
   user agent can only render (or the user prefers to view) monochrome
   graphics.

21 Appendix: origin server implementation considerations

21.1 Implementation with a CGI script

   Transparent content negotiation has been designed to allow a broad
   range of implementation options at the origin server side.  A very
   minimal implementation can be done using the CGI interface.  The CGI
   script below is an example.

      #!/bin/sh

      cat - <<'blex'
      TCN: list
      Alternates: {"stats.tables.html" 1.0 {type text/html} {features
      tables}}, {"stats.html" 0.8 {type text/html}}, {"stats.ps" 0.95
      {type application/postscript}}
      Vary: *
      Content-Type: text/html

      <title>Multiple Choices for Web Statistics</title>
      <h2>Multiple Choices for Web Statistics:</h2>
      <ul>
      <li><a href=stats.tables.html>Version with HTML tables</a>
      <p>
      <li><a href=stats.html>Version without HTML tables</a>
      <p>
      <li><a href=stats.ps>Postscript version</a>
      </ul>
      blex

   The Alternates header in the above script must be read as a single
   line.  The script always generates a list response with the 200 (OK)
   code, which ensures compatibility with non-negotiating HTTP/1.0
   agents.







Holtman & Mutz                Experimental                     [Page 54]

RFC 2295            Transparent Content Negotiation           March 1998


21.2 Direct support by HTTP servers

   Sophisticated HTTP servers could make a transparent negotiation
   module available to content authors.  Such a module could incorporate
   a remote variant selection algorithm and an implementation of the
   algorithm for generating choice responses (section 10.2).  The
   definition of interfaces to such modules is beyond the scope of this
   specification.

21.3 Web publishing tools

   Web publishing tools could automatically generate several variants of
   a document (for example the original TeX version, a HTML version with
   tables, a HTML version without tables, and a Postscript version),
   together with an appropriate variant list in the interface format of
   a HTTP server transparent negotiation module.  This would allow
   documents to be published as transparently negotiable resources.

22 Appendix: Example of choice response construction

   The following is an example of the construction of a choice response
   by a proxy cache which supports HTTP/1.1 and transparent content
   negotiation.  The use of the HTTP/1.1 conditional request mechanisms
   is also shown.

   Assume that a user agent has cached a variant list with the validator
   "1234" for the negotiable resource http://x.org/paper.  Also assume
   that it has cached responses from two neighboring variants, with the
   entity tags "gonkyyyy" and W/"a;b".  Assume that all three user agent
   cache entries are stale: they would need to be revalidated before the
   user agent can use them.  If http://x.org/paper accessed in this
   situation, the user agent could send the following request to its
   proxy cache:

     GET /paper HTTP/1.1
     Host: x.org
     User-Agent: WuxtaWeb/2.4
     Negotiate: 1.0
     Accept: text/html, application/postscript;q=0.4, */*
     Accept-Language: en
     If-None-Match: "gonkyyyy;1234", W/"a;b;1234"

   Assume that the proxy cache has cached the same three items as the
   user agent, but that it has revalidated the variant list 8000 seconds
   ago, so that the list is still fresh for the proxy.  This means that
   the proxy can run a remote variant selection algorithm on the list
   and the incoming request.




Holtman & Mutz                Experimental                     [Page 55]

RFC 2295            Transparent Content Negotiation           March 1998


   Assume that the remote algorithm is able to choose paper.html.en as
   the best variant.  The proxy can now construct a choice response,
   using the algorithm in section 10.2.  In steps 1 and 2 of the
   algorithm, the proxy can construct the following conditional request
   on the best variant, and send it to the origin server:

     GET /paper.html.en HTTP/1.1
     Host: x.org
     User-Agent: WuxtaWeb/2.4
     Negotiate: 1.0
     Accept: text/html, application/postscript;q=0.4, */*
     Accept-Language: en
     If-None-Match: "gonkyyyy", W/"a;b"
     Via: 1.1 fred

   On receipt of the response

     HTTP/1.1 304 Not Modified
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     Etag: "gonkyyyy"

   from the origin server, the proxy can use its freshly revalidated
   paper.html.en cache entry to expand the response to a non-304
   response:

     HTTP/1.1 200 OK
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     Content-Type: text/html
     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
     Content-Length: 5327
     Cache-control: max-age=604800
     Etag: "gonkyyyy"
     Via: 1.1 fred
     Age: 0

     <title>A paper about ....

   Using this 200 response, the proxy can construct a choice response
   in step 4 of the algorithm:

     HTTP/1.1 200 OK
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     TCN: choice
     Content-Type: text/html
     Last-Modified: Mon, 10 Jun 1996 10:01:14 GMT
     Content-Length: 5327
     Cache-control: max-age=604800
     Content-Location: paper.html.en



Holtman & Mutz                Experimental                     [Page 56]

RFC 2295            Transparent Content Negotiation           March 1998


     Alternates: {"paper.html.en" 0.9 {type text/html} {language en}},
                 {"paper.html.fr" 0.7 {type text/html} {language fr}},
                 {"paper.ps.en"   1.0 {type application/postscript}
                     {language en}}

     Etag: "gonkyyyy;1234"
     Vary: negotiate, accept, accept-language
     Expires: Thu, 01 Jan 1980 00:00:00 GMT
     Via: 1.1 fred
     Age: 8000

     <title>A paper about ....

   The choice response can subsequently be shortened to a 304 response,
   because of the If-None-Match header in the original request from the
   user agent.  Thus, the proxy can finally return

     HTTP/1.1 304 Not Modified
     Date: Tue, 11 Jun 1996 20:05:31 GMT
     Etag: "gonkyyyy;1234"
     Content-Location: paper.html.en
     Vary: negotiate, accept, accept-language
     Expires: Thu, 01 Jan 1980 00:00:00 GMT
     Via: 1.1 fred
     Age: 8000

   to the user agent.
























Holtman & Mutz                Experimental                     [Page 57]

RFC 2295            Transparent Content Negotiation           March 1998


23 Full Copyright Statement

   Copyright (C) The Internet Society (1998).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
























Holtman & Mutz                Experimental                     [Page 58]


Added doc/rfc2616.txt.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                      R. Fielding
Request for Comments: 2616                                   UC Irvine
Obsoletes: 2068                                              J. Gettys
Category: Standards Track                                   Compaq/W3C
                                                              J. Mogul
                                                                Compaq
                                                            H. Frystyk
                                                               W3C/MIT
                                                           L. Masinter
                                                                 Xerox
                                                              P. Leach
                                                             Microsoft
                                                        T. Berners-Lee
                                                               W3C/MIT
                                                             June 1999


                Hypertext Transfer Protocol -- HTTP/1.1

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (1999).  All Rights Reserved.

Abstract

   The Hypertext Transfer Protocol (HTTP) is an application-level
   protocol for distributed, collaborative, hypermedia information
   systems. It is a generic, stateless, protocol which can be used for
   many tasks beyond its use for hypertext, such as name servers and
   distributed object management systems, through extension of its
   request methods, error codes and headers [47]. A feature of HTTP is
   the typing and negotiation of data representation, allowing systems
   to be built independently of the data being transferred.

   HTTP has been in use by the World-Wide Web global information
   initiative since 1990. This specification defines the protocol
   referred to as "HTTP/1.1", and is an update to RFC 2068 [33].






Fielding, et al.            Standards Track                     [Page 1]

RFC 2616                        HTTP/1.1                       June 1999


Table of Contents

   1   Introduction ...................................................7
   1.1    Purpose......................................................7
   1.2   Requirements .................................................8
   1.3   Terminology ..................................................8
   1.4   Overall Operation ...........................................12
   2   Notational Conventions and Generic Grammar ....................14
   2.1   Augmented BNF ...............................................14
   2.2   Basic Rules .................................................15
   3   Protocol Parameters ...........................................17
   3.1   HTTP Version ................................................17
   3.2   Uniform Resource Identifiers ................................18
   3.2.1    General Syntax ...........................................19
   3.2.2    http URL .................................................19
   3.2.3    URI Comparison ...........................................20
   3.3   Date/Time Formats ...........................................20
   3.3.1    Full Date ................................................20
   3.3.2    Delta Seconds ............................................21
   3.4   Character Sets ..............................................21
   3.4.1    Missing Charset ..........................................22
   3.5   Content Codings .............................................23
   3.6   Transfer Codings ............................................24
   3.6.1    Chunked Transfer Coding ..................................25
   3.7   Media Types .................................................26
   3.7.1    Canonicalization and Text Defaults .......................27
   3.7.2    Multipart Types ..........................................27
   3.8   Product Tokens ..............................................28
   3.9   Quality Values ..............................................29
   3.10  Language Tags ...............................................29
   3.11  Entity Tags .................................................30
   3.12  Range Units .................................................30
   4   HTTP Message ..................................................31
   4.1   Message Types ...............................................31
   4.2   Message Headers .............................................31
   4.3   Message Body ................................................32
   4.4   Message Length ..............................................33
   4.5   General Header Fields .......................................34
   5   Request .......................................................35
   5.1   Request-Line ................................................35
   5.1.1    Method ...................................................36
   5.1.2    Request-URI ..............................................36
   5.2   The Resource Identified by a Request ........................38
   5.3   Request Header Fields .......................................38
   6   Response ......................................................39
   6.1   Status-Line .................................................39
   6.1.1    Status Code and Reason Phrase ............................39
   6.2   Response Header Fields ......................................41



Fielding, et al.            Standards Track                     [Page 2]

RFC 2616                        HTTP/1.1                       June 1999


   7   Entity ........................................................42
   7.1   Entity Header Fields ........................................42
   7.2   Entity Body .................................................43
   7.2.1    Type .....................................................43
   7.2.2    Entity Length ............................................43
   8   Connections ...................................................44
   8.1   Persistent Connections ......................................44
   8.1.1    Purpose ..................................................44
   8.1.2    Overall Operation ........................................45
   8.1.3    Proxy Servers ............................................46
   8.1.4    Practical Considerations .................................46
   8.2   Message Transmission Requirements ...........................47
   8.2.1    Persistent Connections and Flow Control ..................47
   8.2.2    Monitoring Connections for Error Status Messages .........48
   8.2.3    Use of the 100 (Continue) Status .........................48
   8.2.4    Client Behavior if Server Prematurely Closes Connection ..50
   9   Method Definitions ............................................51
   9.1   Safe and Idempotent Methods .................................51
   9.1.1    Safe Methods .............................................51
   9.1.2    Idempotent Methods .......................................51
   9.2   OPTIONS .....................................................52
   9.3   GET .........................................................53
   9.4   HEAD ........................................................54
   9.5   POST ........................................................54
   9.6   PUT .........................................................55
   9.7   DELETE ......................................................56
   9.8   TRACE .......................................................56
   9.9   CONNECT .....................................................57
   10   Status Code Definitions ......................................57
   10.1  Informational 1xx ...........................................57
   10.1.1   100 Continue .............................................58
   10.1.2   101 Switching Protocols ..................................58
   10.2  Successful 2xx ..............................................58
   10.2.1   200 OK ...................................................58
   10.2.2   201 Created ..............................................59
   10.2.3   202 Accepted .............................................59
   10.2.4   203 Non-Authoritative Information ........................59
   10.2.5   204 No Content ...........................................60
   10.2.6   205 Reset Content ........................................60
   10.2.7   206 Partial Content ......................................60
   10.3  Redirection 3xx .............................................61
   10.3.1   300 Multiple Choices .....................................61
   10.3.2   301 Moved Permanently ....................................62
   10.3.3   302 Found ................................................62
   10.3.4   303 See Other ............................................63
   10.3.5   304 Not Modified .........................................63
   10.3.6   305 Use Proxy ............................................64
   10.3.7   306 (Unused) .............................................64



Fielding, et al.            Standards Track                     [Page 3]

RFC 2616                        HTTP/1.1                       June 1999


   10.3.8   307 Temporary Redirect ...................................65
   10.4  Client Error 4xx ............................................65
   10.4.1    400 Bad Request .........................................65
   10.4.2    401 Unauthorized ........................................66
   10.4.3    402 Payment Required ....................................66
   10.4.4    403 Forbidden ...........................................66
   10.4.5    404 Not Found ...........................................66
   10.4.6    405 Method Not Allowed ..................................66
   10.4.7    406 Not Acceptable ......................................67
   10.4.8    407 Proxy Authentication Required .......................67
   10.4.9    408 Request Timeout .....................................67
   10.4.10   409 Conflict ............................................67
   10.4.11   410 Gone ................................................68
   10.4.12   411 Length Required .....................................68
   10.4.13   412 Precondition Failed .................................68
   10.4.14   413 Request Entity Too Large ............................69
   10.4.15   414 Request-URI Too Long ................................69
   10.4.16   415 Unsupported Media Type ..............................69
   10.4.17   416 Requested Range Not Satisfiable .....................69
   10.4.18   417 Expectation Failed ..................................70
   10.5  Server Error 5xx ............................................70
   10.5.1   500 Internal Server Error ................................70
   10.5.2   501 Not Implemented ......................................70
   10.5.3   502 Bad Gateway ..........................................70
   10.5.4   503 Service Unavailable ..................................70
   10.5.5   504 Gateway Timeout ......................................71
   10.5.6   505 HTTP Version Not Supported ...........................71
   11   Access Authentication ........................................71
   12   Content Negotiation ..........................................71
   12.1  Server-driven Negotiation ...................................72
   12.2  Agent-driven Negotiation ....................................73
   12.3  Transparent Negotiation .....................................74
   13   Caching in HTTP ..............................................74
   13.1.1   Cache Correctness ........................................75
   13.1.2   Warnings .................................................76
   13.1.3   Cache-control Mechanisms .................................77
   13.1.4   Explicit User Agent Warnings .............................78
   13.1.5   Exceptions to the Rules and Warnings .....................78
   13.1.6   Client-controlled Behavior ...............................79
   13.2  Expiration Model ............................................79
   13.2.1   Server-Specified Expiration ..............................79
   13.2.2   Heuristic Expiration .....................................80
   13.2.3   Age Calculations .........................................80
   13.2.4   Expiration Calculations ..................................83
   13.2.5   Disambiguating Expiration Values .........................84
   13.2.6   Disambiguating Multiple Responses ........................84
   13.3  Validation Model ............................................85
   13.3.1   Last-Modified Dates ......................................86



Fielding, et al.            Standards Track                     [Page 4]

RFC 2616                        HTTP/1.1                       June 1999


   13.3.2   Entity Tag Cache Validators ..............................86
   13.3.3   Weak and Strong Validators ...............................86
   13.3.4   Rules for When to Use Entity Tags and Last-Modified Dates.89
   13.3.5   Non-validating Conditionals ..............................90
   13.4  Response Cacheability .......................................91
   13.5  Constructing Responses From Caches ..........................92
   13.5.1   End-to-end and Hop-by-hop Headers ........................92
   13.5.2   Non-modifiable Headers ...................................92
   13.5.3   Combining Headers ........................................94
   13.5.4   Combining Byte Ranges ....................................95
   13.6  Caching Negotiated Responses ................................95
   13.7  Shared and Non-Shared Caches ................................96
   13.8  Errors or Incomplete Response Cache Behavior ................97
   13.9  Side Effects of GET and HEAD ................................97
   13.10   Invalidation After Updates or Deletions ...................97
   13.11   Write-Through Mandatory ...................................98
   13.12   Cache Replacement .........................................99
   13.13   History Lists .............................................99
   14   Header Field Definitions ....................................100
   14.1  Accept .....................................................100
   14.2  Accept-Charset .............................................102
   14.3  Accept-Encoding ............................................102
   14.4  Accept-Language ............................................104
   14.5  Accept-Ranges ..............................................105
   14.6  Age ........................................................106
   14.7  Allow ......................................................106
   14.8  Authorization ..............................................107
   14.9  Cache-Control ..............................................108
   14.9.1   What is Cacheable .......................................109
   14.9.2   What May be Stored by Caches ............................110
   14.9.3   Modifications of the Basic Expiration Mechanism .........111
   14.9.4   Cache Revalidation and Reload Controls ..................113
   14.9.5   No-Transform Directive ..................................115
   14.9.6   Cache Control Extensions ................................116
   14.10   Connection ...............................................117
   14.11   Content-Encoding .........................................118
   14.12   Content-Language .........................................118
   14.13   Content-Length ...........................................119
   14.14   Content-Location .........................................120
   14.15   Content-MD5 ..............................................121
   14.16   Content-Range ............................................122
   14.17   Content-Type .............................................124
   14.18   Date .....................................................124
   14.18.1   Clockless Origin Server Operation ......................125
   14.19   ETag .....................................................126
   14.20   Expect ...................................................126
   14.21   Expires ..................................................127
   14.22   From .....................................................128



Fielding, et al.            Standards Track                     [Page 5]

RFC 2616                        HTTP/1.1                       June 1999


   14.23   Host .....................................................128
   14.24   If-Match .................................................129
   14.25   If-Modified-Since ........................................130
   14.26   If-None-Match ............................................132
   14.27   If-Range .................................................133
   14.28   If-Unmodified-Since ......................................134
   14.29   Last-Modified ............................................134
   14.30   Location .................................................135
   14.31   Max-Forwards .............................................136
   14.32   Pragma ...................................................136
   14.33   Proxy-Authenticate .......................................137
   14.34   Proxy-Authorization ......................................137
   14.35   Range ....................................................138
   14.35.1    Byte Ranges ...........................................138
   14.35.2    Range Retrieval Requests ..............................139
   14.36   Referer ..................................................140
   14.37   Retry-After ..............................................141
   14.38   Server ...................................................141
   14.39   TE .......................................................142
   14.40   Trailer ..................................................143
   14.41  Transfer-Encoding..........................................143
   14.42   Upgrade ..................................................144
   14.43   User-Agent ...............................................145
   14.44   Vary .....................................................145
   14.45   Via ......................................................146
   14.46   Warning ..................................................148
   14.47   WWW-Authenticate .........................................150
   15 Security Considerations .......................................150
   15.1      Personal Information....................................151
   15.1.1   Abuse of Server Log Information .........................151
   15.1.2   Transfer of Sensitive Information .......................151
   15.1.3   Encoding Sensitive Information in URI's .................152
   15.1.4   Privacy Issues Connected to Accept Headers ..............152
   15.2  Attacks Based On File and Path Names .......................153
   15.3  DNS Spoofing ...............................................154
   15.4  Location Headers and Spoofing ..............................154
   15.5  Content-Disposition Issues .................................154
   15.6  Authentication Credentials and Idle Clients ................155
   15.7  Proxies and Caching ........................................155
   15.7.1    Denial of Service Attacks on Proxies....................156
   16   Acknowledgments .............................................156
   17   References ..................................................158
   18   Authors' Addresses ..........................................162
   19   Appendices ..................................................164
   19.1  Internet Media Type message/http and application/http ......164
   19.2  Internet Media Type multipart/byteranges ...................165
   19.3  Tolerant Applications ......................................166
   19.4  Differences Between HTTP Entities and RFC 2045 Entities ....167



Fielding, et al.            Standards Track                     [Page 6]

RFC 2616                        HTTP/1.1                       June 1999


   19.4.1   MIME-Version ............................................167
   19.4.2   Conversion to Canonical Form ............................167
   19.4.3   Conversion of Date Formats ..............................168
   19.4.4   Introduction of Content-Encoding ........................168
   19.4.5   No Content-Transfer-Encoding ............................168
   19.4.6   Introduction of Transfer-Encoding .......................169
   19.4.7   MHTML and Line Length Limitations .......................169
   19.5  Additional Features ........................................169
   19.5.1   Content-Disposition .....................................170
   19.6  Compatibility with Previous Versions .......................170
   19.6.1   Changes from HTTP/1.0 ...................................171
   19.6.2   Compatibility with HTTP/1.0 Persistent Connections ......172
   19.6.3   Changes from RFC 2068 ...................................172
   20   Index .......................................................175
   21   Full Copyright Statement ....................................176

1 Introduction

1.1 Purpose

   The Hypertext Transfer Protocol (HTTP) is an application-level
   protocol for distributed, collaborative, hypermedia information
   systems. HTTP has been in use by the World-Wide Web global
   information initiative since 1990. The first version of HTTP,
   referred to as HTTP/0.9, was a simple protocol for raw data transfer
   across the Internet. HTTP/1.0, as defined by RFC 1945 [6], improved
   the protocol by allowing messages to be in the format of MIME-like
   messages, containing metainformation about the data transferred and
   modifiers on the request/response semantics. However, HTTP/1.0 does
   not sufficiently take into consideration the effects of hierarchical
   proxies, caching, the need for persistent connections, or virtual
   hosts. In addition, the proliferation of incompletely-implemented
   applications calling themselves "HTTP/1.0" has necessitated a
   protocol version change in order for two communicating applications
   to determine each other's true capabilities.

   This specification defines the protocol referred to as "HTTP/1.1".
   This protocol includes more stringent requirements than HTTP/1.0 in
   order to ensure reliable implementation of its features.

   Practical information systems require more functionality than simple
   retrieval, including search, front-end update, and annotation. HTTP
   allows an open-ended set of methods and headers that indicate the
   purpose of a request [47]. It builds on the discipline of reference
   provided by the Uniform Resource Identifier (URI) [3], as a location
   (URL) [4] or name (URN) [20], for indicating the resource to which a





Fielding, et al.            Standards Track                     [Page 7]

RFC 2616                        HTTP/1.1                       June 1999


   method is to be applied. Messages are passed in a format similar to
   that used by Internet mail [9] as defined by the Multipurpose
   Internet Mail Extensions (MIME) [7].

   HTTP is also used as a generic protocol for communication between
   user agents and proxies/gateways to other Internet systems, including
   those supported by the SMTP [16], NNTP [13], FTP [18], Gopher [2],
   and WAIS [10] protocols. In this way, HTTP allows basic hypermedia
   access to resources available from diverse applications.

1.2 Requirements

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in RFC 2119 [34].

   An implementation is not compliant if it fails to satisfy one or more
   of the MUST or REQUIRED level requirements for the protocols it
   implements. An implementation that satisfies all the MUST or REQUIRED
   level and all the SHOULD level requirements for its protocols is said
   to be "unconditionally compliant"; one that satisfies all the MUST
   level requirements but not all the SHOULD level requirements for its
   protocols is said to be "conditionally compliant."

1.3 Terminology

   This specification uses a number of terms to refer to the roles
   played by participants in, and objects of, the HTTP communication.

   connection
      A transport layer virtual circuit established between two programs
      for the purpose of communication.

   message
      The basic unit of HTTP communication, consisting of a structured
      sequence of octets matching the syntax defined in section 4 and
      transmitted via the connection.

   request
      An HTTP request message, as defined in section 5.

   response
      An HTTP response message, as defined in section 6.








Fielding, et al.            Standards Track                     [Page 8]

RFC 2616                        HTTP/1.1                       June 1999


   resource
      A network data object or service that can be identified by a URI,
      as defined in section 3.2. Resources may be available in multiple
      representations (e.g. multiple languages, data formats, size, and
      resolutions) or vary in other ways.

   entity
      The information transferred as the payload of a request or
      response. An entity consists of metainformation in the form of
      entity-header fields and content in the form of an entity-body, as
      described in section 7.

   representation
      An entity included with a response that is subject to content
      negotiation, as described in section 12. There may exist multiple
      representations associated with a particular response status.

   content negotiation
      The mechanism for selecting the appropriate representation when
      servicing a request, as described in section 12. The
      representation of entities in any response can be negotiated
      (including error responses).

   variant
      A resource may have one, or more than one, representation(s)
      associated with it at any given instant. Each of these
      representations is termed a `varriant'.  Use of the term `variant'
      does not necessarily imply that the resource is subject to content
      negotiation.

   client
      A program that establishes connections for the purpose of sending
      requests.

   user agent
      The client which initiates a request. These are often browsers,
      editors, spiders (web-traversing robots), or other end user tools.

   server
      An application program that accepts connections in order to
      service requests by sending back responses. Any given program may
      be capable of being both a client and a server; our use of these
      terms refers only to the role being performed by the program for a
      particular connection, rather than to the program's capabilities
      in general. Likewise, any server may act as an origin server,
      proxy, gateway, or tunnel, switching behavior based on the nature
      of each request.




Fielding, et al.            Standards Track                     [Page 9]

RFC 2616                        HTTP/1.1                       June 1999


   origin server
      The server on which a given resource resides or is to be created.

   proxy
      An intermediary program which acts as both a server and a client
      for the purpose of making requests on behalf of other clients.
      Requests are serviced internally or by passing them on, with
      possible translation, to other servers. A proxy MUST implement
      both the client and server requirements of this specification. A
      "transparent proxy" is a proxy that does not modify the request or
      response beyond what is required for proxy authentication and
      identification. A "non-transparent proxy" is a proxy that modifies
      the request or response in order to provide some added service to
      the user agent, such as group annotation services, media type
      transformation, protocol reduction, or anonymity filtering. Except
      where either transparent or non-transparent behavior is explicitly
      stated, the HTTP proxy requirements apply to both types of
      proxies.

   gateway
      A server which acts as an intermediary for some other server.
      Unlike a proxy, a gateway receives requests as if it were the
      origin server for the requested resource; the requesting client
      may not be aware that it is communicating with a gateway.

   tunnel
      An intermediary program which is acting as a blind relay between
      two connections. Once active, a tunnel is not considered a party
      to the HTTP communication, though the tunnel may have been
      initiated by an HTTP request. The tunnel ceases to exist when both
      ends of the relayed connections are closed.

   cache
      A program's local store of response messages and the subsystem
      that controls its message storage, retrieval, and deletion. A
      cache stores cacheable responses in order to reduce the response
      time and network bandwidth consumption on future, equivalent
      requests. Any client or server may include a cache, though a cache
      cannot be used by a server that is acting as a tunnel.

   cacheable
      A response is cacheable if a cache is allowed to store a copy of
      the response message for use in answering subsequent requests. The
      rules for determining the cacheability of HTTP responses are
      defined in section 13. Even if a resource is cacheable, there may
      be additional constraints on whether a cache can use the cached
      copy for a particular request.




Fielding, et al.            Standards Track                    [Page 10]

RFC 2616                        HTTP/1.1                       June 1999


   first-hand
      A response is first-hand if it comes directly and without
      unnecessary delay from the origin server, perhaps via one or more
      proxies. A response is also first-hand if its validity has just
      been checked directly with the origin server.

   explicit expiration time
      The time at which the origin server intends that an entity should
      no longer be returned by a cache without further validation.

   heuristic expiration time
      An expiration time assigned by a cache when no explicit expiration
      time is available.

   age
      The age of a response is the time since it was sent by, or
      successfully validated with, the origin server.

   freshness lifetime
      The length of time between the generation of a response and its
      expiration time.

   fresh
      A response is fresh if its age has not yet exceeded its freshness
      lifetime.

   stale
      A response is stale if its age has passed its freshness lifetime.

   semantically transparent
      A cache behaves in a "semantically transparent" manner, with
      respect to a particular response, when its use affects neither the
      requesting client nor the origin server, except to improve
      performance. When a cache is semantically transparent, the client
      receives exactly the same response (except for hop-by-hop headers)
      that it would have received had its request been handled directly
      by the origin server.

   validator
      A protocol element (e.g., an entity tag or a Last-Modified time)
      that is used to find out whether a cache entry is an equivalent
      copy of an entity.

   upstream/downstream
      Upstream and downstream describe the flow of a message: all
      messages flow from upstream to downstream.





Fielding, et al.            Standards Track                    [Page 11]

RFC 2616                        HTTP/1.1                       June 1999


   inbound/outbound
      Inbound and outbound refer to the request and response paths for
      messages: "inbound" means "traveling toward the origin server",
      and "outbound" means "traveling toward the user agent"

1.4 Overall Operation

   The HTTP protocol is a request/response protocol. A client sends a
   request to the server in the form of a request method, URI, and
   protocol version, followed by a MIME-like message containing request
   modifiers, client information, and possible body content over a
   connection with a server. The server responds with a status line,
   including the message's protocol version and a success or error code,
   followed by a MIME-like message containing server information, entity
   metainformation, and possible entity-body content. The relationship
   between HTTP and MIME is described in appendix 19.4.

   Most HTTP communication is initiated by a user agent and consists of
   a request to be applied to a resource on some origin server. In the
   simplest case, this may be accomplished via a single connection (v)
   between the user agent (UA) and the origin server (O).

          request chain ------------------------>
       UA -------------------v------------------- O
          <----------------------- response chain

   A more complicated situation occurs when one or more intermediaries
   are present in the request/response chain. There are three common
   forms of intermediary: proxy, gateway, and tunnel. A proxy is a
   forwarding agent, receiving requests for a URI in its absolute form,
   rewriting all or part of the message, and forwarding the reformatted
   request toward the server identified by the URI. A gateway is a
   receiving agent, acting as a layer above some other server(s) and, if
   necessary, translating the requests to the underlying server's
   protocol. A tunnel acts as a relay point between two connections
   without changing the messages; tunnels are used when the
   communication needs to pass through an intermediary (such as a
   firewall) even when the intermediary cannot understand the contents
   of the messages.

          request chain -------------------------------------->
       UA -----v----- A -----v----- B -----v----- C -----v----- O
          <------------------------------------- response chain

   The figure above shows three intermediaries (A, B, and C) between the
   user agent and origin server. A request or response message that
   travels the whole chain will pass through four separate connections.
   This distinction is important because some HTTP communication options



Fielding, et al.            Standards Track                    [Page 12]

RFC 2616                        HTTP/1.1                       June 1999


   may apply only to the connection with the nearest, non-tunnel
   neighbor, only to the end-points of the chain, or to all connections
   along the chain. Although the diagram is linear, each participant may
   be engaged in multiple, simultaneous communications. For example, B
   may be receiving requests from many clients other than A, and/or
   forwarding requests to servers other than C, at the same time that it
   is handling A's request.

   Any party to the communication which is not acting as a tunnel may
   employ an internal cache for handling requests. The effect of a cache
   is that the request/response chain is shortened if one of the
   participants along the chain has a cached response applicable to that
   request. The following illustrates the resulting chain if B has a
   cached copy of an earlier response from O (via C) for a request which
   has not been cached by UA or A.

          request chain ---------->
       UA -----v----- A -----v----- B - - - - - - C - - - - - - O
          <--------- response chain

   Not all responses are usefully cacheable, and some requests may
   contain modifiers which place special requirements on cache behavior.
   HTTP requirements for cache behavior and cacheable responses are
   defined in section 13.

   In fact, there are a wide variety of architectures and configurations
   of caches and proxies currently being experimented with or deployed
   across the World Wide Web. These systems include national hierarchies
   of proxy caches to save transoceanic bandwidth, systems that
   broadcast or multicast cache entries, organizations that distribute
   subsets of cached data via CD-ROM, and so on. HTTP systems are used
   in corporate intranets over high-bandwidth links, and for access via
   PDAs with low-power radio links and intermittent connectivity. The
   goal of HTTP/1.1 is to support the wide diversity of configurations
   already deployed while introducing protocol constructs that meet the
   needs of those who build web applications that require high
   reliability and, failing that, at least reliable indications of
   failure.

   HTTP communication usually takes place over TCP/IP connections. The
   default port is TCP 80 [19], but other ports can be used. This does
   not preclude HTTP from being implemented on top of any other protocol
   on the Internet, or on other networks. HTTP only presumes a reliable
   transport; any protocol that provides such guarantees can be used;
   the mapping of the HTTP/1.1 request and response structures onto the
   transport data units of the protocol in question is outside the scope
   of this specification.




Fielding, et al.            Standards Track                    [Page 13]

RFC 2616                        HTTP/1.1                       June 1999


   In HTTP/1.0, most implementations used a new connection for each
   request/response exchange. In HTTP/1.1, a connection may be used for
   one or more request/response exchanges, although connections may be
   closed for a variety of reasons (see section 8.1).

2 Notational Conventions and Generic Grammar

2.1 Augmented BNF

   All of the mechanisms specified in this document are described in
   both prose and an augmented Backus-Naur Form (BNF) similar to that
   used by RFC 822 [9]. Implementors will need to be familiar with the
   notation in order to understand this specification. The augmented BNF
   includes the following constructs:

   name = definition
      The name of a rule is simply the name itself (without any
      enclosing "<" and ">") and is separated from its definition by the
      equal "=" character. White space is only significant in that
      indentation of continuation lines is used to indicate a rule
      definition that spans more than one line. Certain basic rules are
      in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle
      brackets are used within definitions whenever their presence will
      facilitate discerning the use of rule names.

   "literal"
      Quotation marks surround literal text. Unless stated otherwise,
      the text is case-insensitive.

   rule1 | rule2
      Elements separated by a bar ("|") are alternatives, e.g., "yes |
      no" will accept yes or no.

   (rule1 rule2)
      Elements enclosed in parentheses are treated as a single element.
      Thus, "(elem (foo | bar) elem)" allows the token sequences "elem
      foo elem" and "elem bar elem".

   *rule
      The character "*" preceding an element indicates repetition. The
      full form is "<n>*<m>element" indicating at least <n> and at most
      <m> occurrences of element. Default values are 0 and infinity so
      that "*(element)" allows any number, including zero; "1*element"
      requires at least one; and "1*2element" allows one or two.

   [rule]
      Square brackets enclose optional elements; "[foo bar]" is
      equivalent to "*1(foo bar)".



Fielding, et al.            Standards Track                    [Page 14]

RFC 2616                        HTTP/1.1                       June 1999


   N rule
      Specific repetition: "<n>(element)" is equivalent to
      "<n>*<n>(element)"; that is, exactly <n> occurrences of (element).
      Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three
      alphabetic characters.

   #rule
      A construct "#" is defined, similar to "*", for defining lists of
      elements. The full form is "<n>#<m>element" indicating at least
      <n> and at most <m> elements, each separated by one or more commas
      (",") and OPTIONAL linear white space (LWS). This makes the usual
      form of lists very easy; a rule such as
         ( *LWS element *( *LWS "," *LWS element ))
      can be shown as
         1#element
      Wherever this construct is used, null elements are allowed, but do
      not contribute to the count of elements present. That is,
      "(element), , (element) " is permitted, but counts as only two
      elements. Therefore, where at least one element is required, at
      least one non-null element MUST be present. Default values are 0
      and infinity so that "#element" allows any number, including zero;
      "1#element" requires at least one; and "1#2element" allows one or
      two.

   ; comment
      A semi-colon, set off some distance to the right of rule text,
      starts a comment that continues to the end of line. This is a
      simple way of including useful notes in parallel with the
      specifications.

   implied *LWS
      The grammar described by this specification is word-based. Except
      where noted otherwise, linear white space (LWS) can be included
      between any two adjacent words (token or quoted-string), and
      between adjacent words and separators, without changing the
      interpretation of a field. At least one delimiter (LWS and/or

      separators) MUST exist between any two tokens (for the definition
      of "token" below), since they would otherwise be interpreted as a
      single token.

2.2 Basic Rules

   The following rules are used throughout this specification to
   describe basic parsing constructs. The US-ASCII coded character set
   is defined by ANSI X3.4-1986 [21].





Fielding, et al.            Standards Track                    [Page 15]

RFC 2616                        HTTP/1.1                       June 1999


       OCTET          = <any 8-bit sequence of data>
       CHAR           = <any US-ASCII character (octets 0 - 127)>
       UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
       LOALPHA        = <any US-ASCII lowercase letter "a".."z">
       ALPHA          = UPALPHA | LOALPHA
       DIGIT          = <any US-ASCII digit "0".."9">
       CTL            = <any US-ASCII control character
                        (octets 0 - 31) and DEL (127)>
       CR             = <US-ASCII CR, carriage return (13)>
       LF             = <US-ASCII LF, linefeed (10)>
       SP             = <US-ASCII SP, space (32)>
       HT             = <US-ASCII HT, horizontal-tab (9)>
       <">            = <US-ASCII double-quote mark (34)>

   HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
   protocol elements except the entity-body (see appendix 19.3 for
   tolerant applications). The end-of-line marker within an entity-body
   is defined by its associated media type, as described in section 3.7.

       CRLF           = CR LF

   HTTP/1.1 header field values can be folded onto multiple lines if the
   continuation line begins with a space or horizontal tab. All linear
   white space, including folding, has the same semantics as SP. A
   recipient MAY replace any linear white space with a single SP before
   interpreting the field value or forwarding the message downstream.

       LWS            = [CRLF] 1*( SP | HT )

   The TEXT rule is only used for descriptive field contents and values
   that are not intended to be interpreted by the message parser. Words
   of *TEXT MAY contain characters from character sets other than ISO-
   8859-1 [22] only when encoded according to the rules of RFC 2047
   [14].

       TEXT           = <any OCTET except CTLs,
                        but including LWS>

   A CRLF is allowed in the definition of TEXT only as part of a header
   field continuation. It is expected that the folding LWS will be
   replaced with a single SP before interpretation of the TEXT value.

   Hexadecimal numeric characters are used in several protocol elements.

       HEX            = "A" | "B" | "C" | "D" | "E" | "F"
                      | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT





Fielding, et al.            Standards Track                    [Page 16]

RFC 2616                        HTTP/1.1                       June 1999


   Many HTTP/1.1 header field values consist of words separated by LWS
   or special characters. These special characters MUST be in a quoted
   string to be used within a parameter value (as defined in section
   3.6).

       token          = 1*<any CHAR except CTLs or separators>
       separators     = "(" | ")" | "<" | ">" | "@"
                      | "," | ";" | ":" | "\" | <">
                      | "/" | "[" | "]" | "?" | "="
                      | "{" | "}" | SP | HT

   Comments can be included in some HTTP header fields by surrounding
   the comment text with parentheses. Comments are only allowed in
   fields containing "comment" as part of their field value definition.
   In all other fields, parentheses are considered part of the field
   value.

       comment        = "(" *( ctext | quoted-pair | comment ) ")"
       ctext          = <any TEXT excluding "(" and ")">

   A string of text is parsed as a single word if it is quoted using
   double-quote marks.

       quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
       qdtext         = <any TEXT except <">>

   The backslash character ("\") MAY be used as a single-character
   quoting mechanism only within quoted-string and comment constructs.

       quoted-pair    = "\" CHAR

3 Protocol Parameters

3.1 HTTP Version

   HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
   of the protocol. The protocol versioning policy is intended to allow
   the sender to indicate the format of a message and its capacity for
   understanding further HTTP communication, rather than the features
   obtained via that communication. No change is made to the version
   number for the addition of message components which do not affect
   communication behavior or which only add to extensible field values.
   The <minor> number is incremented when the changes made to the
   protocol add features which do not change the general message parsing
   algorithm, but which may add to the message semantics and imply
   additional capabilities of the sender. The <major> number is
   incremented when the format of a message within the protocol is
   changed. See RFC 2145 [36] for a fuller explanation.



Fielding, et al.            Standards Track                    [Page 17]

RFC 2616                        HTTP/1.1                       June 1999


   The version of an HTTP message is indicated by an HTTP-Version field
   in the first line of the message.

       HTTP-Version   = "HTTP" "/" 1*DIGIT "." 1*DIGIT

   Note that the major and minor numbers MUST be treated as separate
   integers and that each MAY be incremented higher than a single digit.
   Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
   lower than HTTP/12.3. Leading zeros MUST be ignored by recipients and
   MUST NOT be sent.

   An application that sends a request or response message that includes
   HTTP-Version of "HTTP/1.1" MUST be at least conditionally compliant
   with this specification. Applications that are at least conditionally
   compliant with this specification SHOULD use an HTTP-Version of
   "HTTP/1.1" in their messages, and MUST do so for any message that is
   not compatible with HTTP/1.0. For more details on when to send
   specific HTTP-Version values, see RFC 2145 [36].

   The HTTP version of an application is the highest HTTP version for
   which the application is at least conditionally compliant.

   Proxy and gateway applications need to be careful when forwarding
   messages in protocol versions different from that of the application.
   Since the protocol version indicates the protocol capability of the
   sender, a proxy/gateway MUST NOT send a message with a version
   indicator which is greater than its actual version. If a higher
   version request is received, the proxy/gateway MUST either downgrade
   the request version, or respond with an error, or switch to tunnel
   behavior.

   Due to interoperability problems with HTTP/1.0 proxies discovered
   since the publication of RFC 2068[33], caching proxies MUST, gateways
   MAY, and tunnels MUST NOT upgrade the request to the highest version
   they support. The proxy/gateway's response to that request MUST be in
   the same major version as the request.

      Note: Converting between versions of HTTP may involve modification
      of header fields required or forbidden by the versions involved.

3.2 Uniform Resource Identifiers

   URIs have been known by many names: WWW addresses, Universal Document
   Identifiers, Universal Resource Identifiers [3], and finally the
   combination of Uniform Resource Locators (URL) [4] and Names (URN)
   [20]. As far as HTTP is concerned, Uniform Resource Identifiers are
   simply formatted strings which identify--via name, location, or any
   other characteristic--a resource.



Fielding, et al.            Standards Track                    [Page 18]

RFC 2616                        HTTP/1.1                       June 1999


3.2.1 General Syntax

   URIs in HTTP can be represented in absolute form or relative to some
   known base URI [11], depending upon the context of their use. The two
   forms are differentiated by the fact that absolute URIs always begin
   with a scheme name followed by a colon. For definitive information on
   URL syntax and semantics, see "Uniform Resource Identifiers (URI):
   Generic Syntax and Semantics," RFC 2396 [42] (which replaces RFCs
   1738 [4] and RFC 1808 [11]). This specification adopts the
   definitions of "URI-reference", "absoluteURI", "relativeURI", "port",
   "host","abs_path", "rel_path", and "authority" from that
   specification.

   The HTTP protocol does not place any a priori limit on the length of
   a URI. Servers MUST be able to handle the URI of any resource they
   serve, and SHOULD be able to handle URIs of unbounded length if they
   provide GET-based forms that could generate such URIs. A server
   SHOULD return 414 (Request-URI Too Long) status if a URI is longer
   than the server can handle (see section 10.4.15).

      Note: Servers ought to be cautious about depending on URI lengths
      above 255 bytes, because some older client or proxy
      implementations might not properly support these lengths.

3.2.2 http URL

   The "http" scheme is used to locate network resources via the HTTP
   protocol. This section defines the scheme-specific syntax and
   semantics for http URLs.

   http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

   If the port is empty or not given, port 80 is assumed. The semantics
   are that the identified resource is located at the server listening
   for TCP connections on that port of that host, and the Request-URI
   for the resource is abs_path (section 5.1.2). The use of IP addresses
   in URLs SHOULD be avoided whenever possible (see RFC 1900 [24]). If
   the abs_path is not present in the URL, it MUST be given as "/" when
   used as a Request-URI for a resource (section 5.1.2). If a proxy
   receives a host name which is not a fully qualified domain name, it
   MAY add its domain to the host name it received. If a proxy receives
   a fully qualified domain name, the proxy MUST NOT change the host
   name.








Fielding, et al.            Standards Track                    [Page 19]

RFC 2616                        HTTP/1.1                       June 1999


3.2.3 URI Comparison

   When comparing two URIs to decide if they match or not, a client
   SHOULD use a case-sensitive octet-by-octet comparison of the entire
   URIs, with these exceptions:

      - A port that is empty or not given is equivalent to the default
        port for that URI-reference;

        - Comparisons of host names MUST be case-insensitive;

        - Comparisons of scheme names MUST be case-insensitive;

        - An empty abs_path is equivalent to an abs_path of "/".

   Characters other than those in the "reserved" and "unsafe" sets (see
   RFC 2396 [42]) are equivalent to their ""%" HEX HEX" encoding.

   For example, the following three URIs are equivalent:

      http://abc.com:80/~smith/home.html
      http://ABC.com/%7Esmith/home.html
      http://ABC.com:/%7esmith/home.html

3.3 Date/Time Formats

3.3.1 Full Date

   HTTP applications have historically allowed three different formats
   for the representation of date/time stamps:

      Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
      Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
      Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

   The first format is preferred as an Internet standard and represents
   a fixed-length subset of that defined by RFC 1123 [8] (an update to
   RFC 822 [9]). The second format is in common use, but is based on the
   obsolete RFC 850 [12] date format and lacks a four-digit year.
   HTTP/1.1 clients and servers that parse the date value MUST accept
   all three formats (for compatibility with HTTP/1.0), though they MUST
   only generate the RFC 1123 format for representing HTTP-date values
   in header fields. See section 19.3 for further information.

      Note: Recipients of date values are encouraged to be robust in
      accepting date values that may have been sent by non-HTTP
      applications, as is sometimes the case when retrieving or posting
      messages via proxies/gateways to SMTP or NNTP.



Fielding, et al.            Standards Track                    [Page 20]

RFC 2616                        HTTP/1.1                       June 1999


   All HTTP date/time stamps MUST be represented in Greenwich Mean Time
   (GMT), without exception. For the purposes of HTTP, GMT is exactly
   equal to UTC (Coordinated Universal Time). This is indicated in the
   first two formats by the inclusion of "GMT" as the three-letter
   abbreviation for time zone, and MUST be assumed when reading the
   asctime format. HTTP-date is case sensitive and MUST NOT include
   additional LWS beyond that specifically included as SP in the
   grammar.

       HTTP-date    = rfc1123-date | rfc850-date | asctime-date
       rfc1123-date = wkday "," SP date1 SP time SP "GMT"
       rfc850-date  = weekday "," SP date2 SP time SP "GMT"
       asctime-date = wkday SP date3 SP time SP 4DIGIT
       date1        = 2DIGIT SP month SP 4DIGIT
                      ; day month year (e.g., 02 Jun 1982)
       date2        = 2DIGIT "-" month "-" 2DIGIT
                      ; day-month-year (e.g., 02-Jun-82)
       date3        = month SP ( 2DIGIT | ( SP 1DIGIT ))
                      ; month day (e.g., Jun  2)
       time         = 2DIGIT ":" 2DIGIT ":" 2DIGIT
                      ; 00:00:00 - 23:59:59
       wkday        = "Mon" | "Tue" | "Wed"
                    | "Thu" | "Fri" | "Sat" | "Sun"
       weekday      = "Monday" | "Tuesday" | "Wednesday"
                    | "Thursday" | "Friday" | "Saturday" | "Sunday"
       month        = "Jan" | "Feb" | "Mar" | "Apr"
                    | "May" | "Jun" | "Jul" | "Aug"
                    | "Sep" | "Oct" | "Nov" | "Dec"

      Note: HTTP requirements for the date/time stamp format apply only
      to their usage within the protocol stream. Clients and servers are
      not required to use these formats for user presentation, request
      logging, etc.

3.3.2 Delta Seconds

   Some HTTP header fields allow a time value to be specified as an
   integer number of seconds, represented in decimal, after the time
   that the message was received.

       delta-seconds  = 1*DIGIT

3.4 Character Sets

   HTTP uses the same definition of the term "character set" as that
   described for MIME:





Fielding, et al.            Standards Track                    [Page 21]

RFC 2616                        HTTP/1.1                       June 1999


   The term "character set" is used in this document to refer to a
   method used with one or more tables to convert a sequence of octets
   into a sequence of characters. Note that unconditional conversion in
   the other direction is not required, in that not all characters may
   be available in a given character set and a character set may provide
   more than one sequence of octets to represent a particular character.
   This definition is intended to allow various kinds of character
   encoding, from simple single-table mappings such as US-ASCII to
   complex table switching methods such as those that use ISO-2022's
   techniques. However, the definition associated with a MIME character
   set name MUST fully specify the mapping to be performed from octets
   to characters. In particular, use of external profiling information
   to determine the exact mapping is not permitted.

      Note: This use of the term "character set" is more commonly
      referred to as a "character encoding." However, since HTTP and
      MIME share the same registry, it is important that the terminology
      also be shared.

   HTTP character sets are identified by case-insensitive tokens. The
   complete set of tokens is defined by the IANA Character Set registry
   [19].

       charset = token

   Although HTTP allows an arbitrary token to be used as a charset
   value, any token that has a predefined value within the IANA
   Character Set registry [19] MUST represent the character set defined
   by that registry. Applications SHOULD limit their use of character
   sets to those defined by the IANA registry.

   Implementors should be aware of IETF character set requirements [38]
   [41].

3.4.1 Missing Charset

   Some HTTP/1.0 software has interpreted a Content-Type header without
   charset parameter incorrectly to mean "recipient should guess."
   Senders wishing to defeat this behavior MAY include a charset
   parameter even when the charset is ISO-8859-1 and SHOULD do so when
   it is known that it will not confuse the recipient.

   Unfortunately, some older HTTP/1.0 clients did not deal properly with
   an explicit charset parameter. HTTP/1.1 recipients MUST respect the
   charset label provided by the sender; and those user agents that have
   a provision to "guess" a charset MUST use the charset from the





Fielding, et al.            Standards Track                    [Page 22]

RFC 2616                        HTTP/1.1                       June 1999


   content-type field if they support that charset, rather than the
   recipient's preference, when initially displaying a document. See
   section 3.7.1.

3.5 Content Codings

   Content coding values indicate an encoding transformation that has
   been or can be applied to an entity. Content codings are primarily
   used to allow a document to be compressed or otherwise usefully
   transformed without losing the identity of its underlying media type
   and without loss of information. Frequently, the entity is stored in
   coded form, transmitted directly, and only decoded by the recipient.

       content-coding   = token

   All content-coding values are case-insensitive. HTTP/1.1 uses
   content-coding values in the Accept-Encoding (section 14.3) and
   Content-Encoding (section 14.11) header fields. Although the value
   describes the content-coding, what is more important is that it
   indicates what decoding mechanism will be required to remove the
   encoding.

   The Internet Assigned Numbers Authority (IANA) acts as a registry for
   content-coding value tokens. Initially, the registry contains the
   following tokens:

   gzip An encoding format produced by the file compression program
        "gzip" (GNU zip) as described in RFC 1952 [25]. This format is a
        Lempel-Ziv coding (LZ77) with a 32 bit CRC.

   compress
        The encoding format produced by the common UNIX file compression
        program "compress". This format is an adaptive Lempel-Ziv-Welch
        coding (LZW).

        Use of program names for the identification of encoding formats
        is not desirable and is discouraged for future encodings. Their
        use here is representative of historical practice, not good
        design. For compatibility with previous implementations of HTTP,
        applications SHOULD consider "x-gzip" and "x-compress" to be
        equivalent to "gzip" and "compress" respectively.

   deflate
        The "zlib" format defined in RFC 1950 [31] in combination with
        the "deflate" compression mechanism described in RFC 1951 [29].






Fielding, et al.            Standards Track                    [Page 23]

RFC 2616                        HTTP/1.1                       June 1999


   identity
        The default (identity) encoding; the use of no transformation
        whatsoever. This content-coding is used only in the Accept-
        Encoding header, and SHOULD NOT be used in the Content-Encoding
        header.

   New content-coding value tokens SHOULD be registered; to allow
   interoperability between clients and servers, specifications of the
   content coding algorithms needed to implement a new value SHOULD be
   publicly available and adequate for independent implementation, and
   conform to the purpose of content coding defined in this section.

3.6 Transfer Codings

   Transfer-coding values are used to indicate an encoding
   transformation that has been, can be, or may need to be applied to an
   entity-body in order to ensure "safe transport" through the network.
   This differs from a content coding in that the transfer-coding is a
   property of the message, not of the original entity.

       transfer-coding         = "chunked" | transfer-extension
       transfer-extension      = token *( ";" parameter )

   Parameters are in  the form of attribute/value pairs.

       parameter               = attribute "=" value
       attribute               = token
       value                   = token | quoted-string

   All transfer-coding values are case-insensitive. HTTP/1.1 uses
   transfer-coding values in the TE header field (section 14.39) and in
   the Transfer-Encoding header field (section 14.41).

   Whenever a transfer-coding is applied to a message-body, the set of
   transfer-codings MUST include "chunked", unless the message is
   terminated by closing the connection. When the "chunked" transfer-
   coding is used, it MUST be the last transfer-coding applied to the
   message-body. The "chunked" transfer-coding MUST NOT be applied more
   than once to a message-body. These rules allow the recipient to
   determine the transfer-length of the message (section 4.4).

   Transfer-codings are analogous to the Content-Transfer-Encoding
   values of MIME [7], which were designed to enable safe transport of
   binary data over a 7-bit transport service. However, safe transport
   has a different focus for an 8bit-clean transfer protocol. In HTTP,
   the only unsafe characteristic of message-bodies is the difficulty in
   determining the exact body length (section 7.2.2), or the desire to
   encrypt data over a shared transport.



Fielding, et al.            Standards Track                    [Page 24]

RFC 2616                        HTTP/1.1                       June 1999


   The Internet Assigned Numbers Authority (IANA) acts as a registry for
   transfer-coding value tokens. Initially, the registry contains the
   following tokens: "chunked" (section 3.6.1), "identity" (section
   3.6.2), "gzip" (section 3.5), "compress" (section 3.5), and "deflate"
   (section 3.5).

   New transfer-coding value tokens SHOULD be registered in the same way
   as new content-coding value tokens (section 3.5).

   A server which receives an entity-body with a transfer-coding it does
   not understand SHOULD return 501 (Unimplemented), and close the
   connection. A server MUST NOT send transfer-codings to an HTTP/1.0
   client.

3.6.1 Chunked Transfer Coding

   The chunked encoding modifies the body of a message in order to
   transfer it as a series of chunks, each with its own size indicator,
   followed by an OPTIONAL trailer containing entity-header fields. This
   allows dynamically produced content to be transferred along with the
   information necessary for the recipient to verify that it has
   received the full message.

       Chunked-Body   = *chunk
                        last-chunk
                        trailer
                        CRLF

       chunk          = chunk-size [ chunk-extension ] CRLF
                        chunk-data CRLF
       chunk-size     = 1*HEX
       last-chunk     = 1*("0") [ chunk-extension ] CRLF

       chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
       chunk-ext-name = token
       chunk-ext-val  = token | quoted-string
       chunk-data     = chunk-size(OCTET)
       trailer        = *(entity-header CRLF)

   The chunk-size field is a string of hex digits indicating the size of
   the chunk. The chunked encoding is ended by any chunk whose size is
   zero, followed by the trailer, which is terminated by an empty line.

   The trailer allows the sender to include additional HTTP header
   fields at the end of the message. The Trailer header field can be
   used to indicate which header fields are included in a trailer (see
   section 14.40).




Fielding, et al.            Standards Track                    [Page 25]

RFC 2616                        HTTP/1.1                       June 1999


   A server using chunked transfer-coding in a response MUST NOT use the
   trailer for any header fields unless at least one of the following is
   true:

   a)the request included a TE header field that indicates "trailers" is
     acceptable in the transfer-coding of the  response, as described in
     section 14.39; or,

   b)the server is the origin server for the response, the trailer
     fields consist entirely of optional metadata, and the recipient
     could use the message (in a manner acceptable to the origin server)
     without receiving this metadata.  In other words, the origin server
     is willing to accept the possibility that the trailer fields might
     be silently discarded along the path to the client.

   This requirement prevents an interoperability failure when the
   message is being received by an HTTP/1.1 (or later) proxy and
   forwarded to an HTTP/1.0 recipient. It avoids a situation where
   compliance with the protocol would have necessitated a possibly
   infinite buffer on the proxy.

   An example process for decoding a Chunked-Body is presented in
   appendix 19.4.6.

   All HTTP/1.1 applications MUST be able to receive and decode the
   "chunked" transfer-coding, and MUST ignore chunk-extension extensions
   they do not understand.

3.7 Media Types

   HTTP uses Internet Media Types [17] in the Content-Type (section
   14.17) and Accept (section 14.1) header fields in order to provide
   open and extensible data typing and type negotiation.

       media-type     = type "/" subtype *( ";" parameter )
       type           = token
       subtype        = token

   Parameters MAY follow the type/subtype in the form of attribute/value
   pairs (as defined in section 3.6).

   The type, subtype, and parameter attribute names are case-
   insensitive. Parameter values might or might not be case-sensitive,
   depending on the semantics of the parameter name. Linear white space
   (LWS) MUST NOT be used between the type and subtype, nor between an
   attribute and its value. The presence or absence of a parameter might
   be significant to the processing of a media-type, depending on its
   definition within the media type registry.



Fielding, et al.            Standards Track                    [Page 26]

RFC 2616                        HTTP/1.1                       June 1999


   Note that some older HTTP applications do not recognize media type
   parameters. When sending data to older HTTP applications,
   implementations SHOULD only use media type parameters when they are
   required by that type/subtype definition.

   Media-type values are registered with the Internet Assigned Number
   Authority (IANA [19]). The media type registration process is
   outlined in RFC 1590 [17]. Use of non-registered media types is
   discouraged.

3.7.1 Canonicalization and Text Defaults

   Internet media types are registered with a canonical form. An
   entity-body transferred via HTTP messages MUST be represented in the
   appropriate canonical form prior to its transmission except for
   "text" types, as defined in the next paragraph.

   When in canonical form, media subtypes of the "text" type use CRLF as
   the text line break. HTTP relaxes this requirement and allows the
   transport of text media with plain CR or LF alone representing a line
   break when it is done consistently for an entire entity-body. HTTP
   applications MUST accept CRLF, bare CR, and bare LF as being
   representative of a line break in text media received via HTTP. In
   addition, if the text is represented in a character set that does not
   use octets 13 and 10 for CR and LF respectively, as is the case for
   some multi-byte character sets, HTTP allows the use of whatever octet
   sequences are defined by that character set to represent the
   equivalent of CR and LF for line breaks. This flexibility regarding
   line breaks applies only to text media in the entity-body; a bare CR
   or LF MUST NOT be substituted for CRLF within any of the HTTP control
   structures (such as header fields and multipart boundaries).

   If an entity-body is encoded with a content-coding, the underlying
   data MUST be in a form defined above prior to being encoded.

   The "charset" parameter is used with some media types to define the
   character set (section 3.4) of the data. When no explicit charset
   parameter is provided by the sender, media subtypes of the "text"
   type are defined to have a default charset value of "ISO-8859-1" when
   received via HTTP. Data in character sets other than "ISO-8859-1" or
   its subsets MUST be labeled with an appropriate charset value. See
   section 3.4.1 for compatibility problems.

3.7.2 Multipart Types

   MIME provides for a number of "multipart" types -- encapsulations of
   one or more entities within a single message-body. All multipart
   types share a common syntax, as defined in section 5.1.1 of RFC 2046



Fielding, et al.            Standards Track                    [Page 27]

RFC 2616                        HTTP/1.1                       June 1999


   [40], and MUST include a boundary parameter as part of the media type
   value. The message body is itself a protocol element and MUST
   therefore use only CRLF to represent line breaks between body-parts.
   Unlike in RFC 2046, the epilogue of any multipart message MUST be
   empty; HTTP applications MUST NOT transmit the epilogue (even if the
   original multipart contains an epilogue). These restrictions exist in
   order to preserve the self-delimiting nature of a multipart message-
   body, wherein the "end" of the message-body is indicated by the
   ending multipart boundary.

   In general, HTTP treats a multipart message-body no differently than
   any other media type: strictly as payload. The one exception is the
   "multipart/byteranges" type (appendix 19.2) when it appears in a 206
   (Partial Content) response, which will be interpreted by some HTTP
   caching mechanisms as described in sections 13.5.4 and 14.16. In all
   other cases, an HTTP user agent SHOULD follow the same or similar
   behavior as a MIME user agent would upon receipt of a multipart type.
   The MIME header fields within each body-part of a multipart message-
   body do not have any significance to HTTP beyond that defined by
   their MIME semantics.

   In general, an HTTP user agent SHOULD follow the same or similar
   behavior as a MIME user agent would upon receipt of a multipart type.
   If an application receives an unrecognized multipart subtype, the
   application MUST treat it as being equivalent to "multipart/mixed".

      Note: The "multipart/form-data" type has been specifically defined
      for carrying form data suitable for processing via the POST
      request method, as described in RFC 1867 [15].

3.8 Product Tokens

   Product tokens are used to allow communicating applications to
   identify themselves by software name and version. Most fields using
   product tokens also allow sub-products which form a significant part
   of the application to be listed, separated by white space. By
   convention, the products are listed in order of their significance
   for identifying the application.

       product         = token ["/" product-version]
       product-version = token

   Examples:

       User-Agent: CERN-LineMode/2.15 libwww/2.17b3
       Server: Apache/0.8.4





Fielding, et al.            Standards Track                    [Page 28]

RFC 2616                        HTTP/1.1                       June 1999


   Product tokens SHOULD be short and to the point. They MUST NOT be
   used for advertising or other non-essential information. Although any
   token character MAY appear in a product-version, this token SHOULD
   only be used for a version identifier (i.e., successive versions of
   the same product SHOULD only differ in the product-version portion of
   the product value).

3.9 Quality Values

   HTTP content negotiation (section 12) uses short "floating point"
   numbers to indicate the relative importance ("weight") of various
   negotiable parameters.  A weight is normalized to a real number in
   the range 0 through 1, where 0 is the minimum and 1 the maximum
   value. If a parameter has a quality value of 0, then content with
   this parameter is `not acceptable' for the client. HTTP/1.1
   applications MUST NOT generate more than three digits after the
   decimal point. User configuration of these values SHOULD also be
   limited in this fashion.

       qvalue         = ( "0" [ "." 0*3DIGIT ] )
                      | ( "1" [ "." 0*3("0") ] )

   "Quality values" is a misnomer, since these values merely represent
   relative degradation in desired quality.

3.10 Language Tags

   A language tag identifies a natural language spoken, written, or
   otherwise conveyed by human beings for communication of information
   to other human beings. Computer languages are explicitly excluded.
   HTTP uses language tags within the Accept-Language and Content-
   Language fields.

   The syntax and registry of HTTP language tags is the same as that
   defined by RFC 1766 [1]. In summary, a language tag is composed of 1
   or more parts: A primary language tag and a possibly empty series of
   subtags:

        language-tag  = primary-tag *( "-" subtag )
        primary-tag   = 1*8ALPHA
        subtag        = 1*8ALPHA

   White space is not allowed within the tag and all tags are case-
   insensitive. The name space of language tags is administered by the
   IANA. Example tags include:

       en, en-US, en-cockney, i-cherokee, x-pig-latin




Fielding, et al.            Standards Track                    [Page 29]

RFC 2616                        HTTP/1.1                       June 1999


   where any two-letter primary-tag is an ISO-639 language abbreviation
   and any two-letter initial subtag is an ISO-3166 country code. (The
   last three tags above are not registered tags; all but the last are
   examples of tags which could be registered in future.)

3.11 Entity Tags

   Entity tags are used for comparing two or more entities from the same
   requested resource. HTTP/1.1 uses entity tags in the ETag (section
   14.19), If-Match (section 14.24), If-None-Match (section 14.26), and
   If-Range (section 14.27) header fields. The definition of how they
   are used and compared as cache validators is in section 13.3.3. An
   entity tag consists of an opaque quoted string, possibly prefixed by
   a weakness indicator.

      entity-tag = [ weak ] opaque-tag
      weak       = "W/"
      opaque-tag = quoted-string

   A "strong entity tag" MAY be shared by two entities of a resource
   only if they are equivalent by octet equality.

   A "weak entity tag," indicated by the "W/" prefix, MAY be shared by
   two entities of a resource only if the entities are equivalent and
   could be substituted for each other with no significant change in
   semantics. A weak entity tag can only be used for weak comparison.

   An entity tag MUST be unique across all versions of all entities
   associated with a particular resource. A given entity tag value MAY
   be used for entities obtained by requests on different URIs. The use
   of the same entity tag value in conjunction with entities obtained by
   requests on different URIs does not imply the equivalence of those
   entities.

3.12 Range Units

   HTTP/1.1 allows a client to request that only part (a range of) the
   response entity be included within the response. HTTP/1.1 uses range
   units in the Range (section 14.35) and Content-Range (section 14.16)
   header fields. An entity can be broken down into subranges according
   to various structural units.

      range-unit       = bytes-unit | other-range-unit
      bytes-unit       = "bytes"
      other-range-unit = token

   The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1
   implementations MAY ignore ranges specified using other units.



Fielding, et al.            Standards Track                    [Page 30]

RFC 2616                        HTTP/1.1                       June 1999


   HTTP/1.1 has been designed to allow implementations of applications
   that do not depend on knowledge of ranges.

4 HTTP Message

4.1 Message Types

   HTTP messages consist of requests from client to server and responses
   from server to client.

       HTTP-message   = Request | Response     ; HTTP/1.1 messages

   Request (section 5) and Response (section 6) messages use the generic
   message format of RFC 822 [9] for transferring entities (the payload
   of the message). Both types of message consist of a start-line, zero
   or more header fields (also known as "headers"), an empty line (i.e.,
   a line with nothing preceding the CRLF) indicating the end of the
   header fields, and possibly a message-body.

        generic-message = start-line
                          *(message-header CRLF)
                          CRLF
                          [ message-body ]
        start-line      = Request-Line | Status-Line

   In the interest of robustness, servers SHOULD ignore any empty
   line(s) received where a Request-Line is expected. In other words, if
   the server is reading the protocol stream at the beginning of a
   message and receives a CRLF first, it should ignore the CRLF.

   Certain buggy HTTP/1.0 client implementations generate extra CRLF's
   after a POST request. To restate what is explicitly forbidden by the
   BNF, an HTTP/1.1 client MUST NOT preface or follow a request with an
   extra CRLF.

4.2 Message Headers

   HTTP header fields, which include general-header (section 4.5),
   request-header (section 5.3), response-header (section 6.2), and
   entity-header (section 7.1) fields, follow the same generic format as
   that given in Section 3.1 of RFC 822 [9]. Each header field consists
   of a name followed by a colon (":") and the field value. Field names
   are case-insensitive. The field value MAY be preceded by any amount
   of LWS, though a single SP is preferred. Header fields can be
   extended over multiple lines by preceding each extra line with at
   least one SP or HT. Applications ought to follow "common form", where
   one is known or indicated, when generating HTTP constructs, since
   there might exist some implementations that fail to accept anything



Fielding, et al.            Standards Track                    [Page 31]

RFC 2616                        HTTP/1.1                       June 1999


   beyond the common forms.

       message-header = field-name ":" [ field-value ]
       field-name     = token
       field-value    = *( field-content | LWS )
       field-content  = <the OCTETs making up the field-value
                        and consisting of either *TEXT or combinations
                        of token, separators, and quoted-string>

   The field-content does not include any leading or trailing LWS:
   linear white space occurring before the first non-whitespace
   character of the field-value or after the last non-whitespace
   character of the field-value. Such leading or trailing LWS MAY be
   removed without changing the semantics of the field value. Any LWS
   that occurs between field-content MAY be replaced with a single SP
   before interpreting the field value or forwarding the message
   downstream.

   The order in which header fields with differing field names are
   received is not significant. However, it is "good practice" to send
   general-header fields first, followed by request-header or response-
   header fields, and ending with the entity-header fields.

   Multiple message-header fields with the same field-name MAY be
   present in a message if and only if the entire field-value for that
   header field is defined as a comma-separated list [i.e., #(values)].
   It MUST be possible to combine the multiple header fields into one
   "field-name: field-value" pair, without changing the semantics of the
   message, by appending each subsequent field-value to the first, each
   separated by a comma. The order in which header fields with the same
   field-name are received is therefore significant to the
   interpretation of the combined field value, and thus a proxy MUST NOT
   change the order of these field values when a message is forwarded.

4.3 Message Body

   The message-body (if any) of an HTTP message is used to carry the
   entity-body associated with the request or response. The message-body
   differs from the entity-body only when a transfer-coding has been
   applied, as indicated by the Transfer-Encoding header field (section
   14.41).

       message-body = entity-body
                    | <entity-body encoded as per Transfer-Encoding>

   Transfer-Encoding MUST be used to indicate any transfer-codings
   applied by an application to ensure safe and proper transfer of the
   message. Transfer-Encoding is a property of the message, not of the



Fielding, et al.            Standards Track                    [Page 32]

RFC 2616                        HTTP/1.1                       June 1999


   entity, and thus MAY be added or removed by any application along the
   request/response chain. (However, section 3.6 places restrictions on
   when certain transfer-codings may be used.)

   The rules for when a message-body is allowed in a message differ for
   requests and responses.

   The presence of a message-body in a request is signaled by the
   inclusion of a Content-Length or Transfer-Encoding header field in
   the request's message-headers. A message-body MUST NOT be included in
   a request if the specification of the request method (section 5.1.1)
   does not allow sending an entity-body in requests. A server SHOULD
   read and forward a message-body on any request; if the request method
   does not include defined semantics for an entity-body, then the
   message-body SHOULD be ignored when handling the request.

   For response messages, whether or not a message-body is included with
   a message is dependent on both the request method and the response
   status code (section 6.1.1). All responses to the HEAD request method
   MUST NOT include a message-body, even though the presence of entity-
   header fields might lead one to believe they do. All 1xx
   (informational), 204 (no content), and 304 (not modified) responses
   MUST NOT include a message-body. All other responses do include a
   message-body, although it MAY be of zero length.

4.4 Message Length

   The transfer-length of a message is the length of the message-body as
   it appears in the message; that is, after any transfer-codings have
   been applied. When a message-body is included with a message, the
   transfer-length of that body is determined by one of the following
   (in order of precedence):

   1.Any response message which "MUST NOT" include a message-body (such
     as the 1xx, 204, and 304 responses and any response to a HEAD
     request) is always terminated by the first empty line after the
     header fields, regardless of the entity-header fields present in
     the message.

   2.If a Transfer-Encoding header field (section 14.41) is present and
     has any value other than "identity", then the transfer-length is
     defined by use of the "chunked" transfer-coding (section 3.6),
     unless the message is terminated by closing the connection.

   3.If a Content-Length header field (section 14.13) is present, its
     decimal value in OCTETs represents both the entity-length and the
     transfer-length. The Content-Length header field MUST NOT be sent
     if these two lengths are different (i.e., if a Transfer-Encoding



Fielding, et al.            Standards Track                    [Page 33]

RFC 2616                        HTTP/1.1                       June 1999


     header field is present). If a message is received with both a
     Transfer-Encoding header field and a Content-Length header field,
     the latter MUST be ignored.

   4.If the message uses the media type "multipart/byteranges", and the
     ransfer-length is not otherwise specified, then this self-
     elimiting media type defines the transfer-length. This media type
     UST NOT be used unless the sender knows that the recipient can arse
     it; the presence in a request of a Range header with ultiple byte-
     range specifiers from a 1.1 client implies that the lient can parse
     multipart/byteranges responses.

       A range header might be forwarded by a 1.0 proxy that does not
       understand multipart/byteranges; in this case the server MUST
       delimit the message using methods defined in items 1,3 or 5 of
       this section.

   5.By the server closing the connection. (Closing the connection
     cannot be used to indicate the end of a request body, since that
     would leave no possibility for the server to send back a response.)

   For compatibility with HTTP/1.0 applications, HTTP/1.1 requests
   containing a message-body MUST include a valid Content-Length header
   field unless the server is known to be HTTP/1.1 compliant. If a
   request contains a message-body and a Content-Length is not given,
   the server SHOULD respond with 400 (bad request) if it cannot
   determine the length of the message, or with 411 (length required) if
   it wishes to insist on receiving a valid Content-Length.

   All HTTP/1.1 applications that receive entities MUST accept the
   "chunked" transfer-coding (section 3.6), thus allowing this mechanism
   to be used for messages when the message length cannot be determined
   in advance.

   Messages MUST NOT include both a Content-Length header field and a
   non-identity transfer-coding. If the message does include a non-
   identity transfer-coding, the Content-Length MUST be ignored.

   When a Content-Length is given in a message where a message-body is
   allowed, its field value MUST exactly match the number of OCTETs in
   the message-body. HTTP/1.1 user agents MUST notify the user when an
   invalid length is received and detected.

4.5 General Header Fields

   There are a few header fields which have general applicability for
   both request and response messages, but which do not apply to the
   entity being transferred. These header fields apply only to the



Fielding, et al.            Standards Track                    [Page 34]

RFC 2616                        HTTP/1.1                       June 1999


   message being transmitted.

       general-header = Cache-Control            ; Section 14.9
                      | Connection               ; Section 14.10
                      | Date                     ; Section 14.18
                      | Pragma                   ; Section 14.32
                      | Trailer                  ; Section 14.40
                      | Transfer-Encoding        ; Section 14.41
                      | Upgrade                  ; Section 14.42
                      | Via                      ; Section 14.45
                      | Warning                  ; Section 14.46

   General-header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields may be given the semantics of general
   header fields if all parties in the communication recognize them to
   be general-header fields. Unrecognized header fields are treated as
   entity-header fields.

5 Request

   A request message from a client to a server includes, within the
   first line of that message, the method to be applied to the resource,
   the identifier of the resource, and the protocol version in use.

        Request       = Request-Line              ; Section 5.1
                        *(( general-header        ; Section 4.5
                         | request-header         ; Section 5.3
                         | entity-header ) CRLF)  ; Section 7.1
                        CRLF
                        [ message-body ]          ; Section 4.3

5.1 Request-Line

   The Request-Line begins with a method token, followed by the
   Request-URI and the protocol version, and ending with CRLF. The
   elements are separated by SP characters. No CR or LF is allowed
   except in the final CRLF sequence.

        Request-Line   = Method SP Request-URI SP HTTP-Version CRLF











Fielding, et al.            Standards Track                    [Page 35]

RFC 2616                        HTTP/1.1                       June 1999


5.1.1 Method

   The Method  token indicates the method to be performed on the
   resource identified by the Request-URI. The method is case-sensitive.

       Method         = "OPTIONS"                ; Section 9.2
                      | "GET"                    ; Section 9.3
                      | "HEAD"                   ; Section 9.4
                      | "POST"                   ; Section 9.5
                      | "PUT"                    ; Section 9.6
                      | "DELETE"                 ; Section 9.7
                      | "TRACE"                  ; Section 9.8
                      | "CONNECT"                ; Section 9.9
                      | extension-method
       extension-method = token

   The list of methods allowed by a resource can be specified in an
   Allow header field (section 14.7). The return code of the response
   always notifies the client whether a method is currently allowed on a
   resource, since the set of allowed methods can change dynamically. An
   origin server SHOULD return the status code 405 (Method Not Allowed)
   if the method is known by the origin server but not allowed for the
   requested resource, and 501 (Not Implemented) if the method is
   unrecognized or not implemented by the origin server. The methods GET
   and HEAD MUST be supported by all general-purpose servers. All other
   methods are OPTIONAL; however, if the above methods are implemented,
   they MUST be implemented with the same semantics as those specified
   in section 9.

5.1.2 Request-URI

   The Request-URI is a Uniform Resource Identifier (section 3.2) and
   identifies the resource upon which to apply the request.

       Request-URI    = "*" | absoluteURI | abs_path | authority

   The four options for Request-URI are dependent on the nature of the
   request. The asterisk "*" means that the request does not apply to a
   particular resource, but to the server itself, and is only allowed
   when the method used does not necessarily apply to a resource. One
   example would be

       OPTIONS * HTTP/1.1

   The absoluteURI form is REQUIRED when the request is being made to a
   proxy. The proxy is requested to forward the request or service it
   from a valid cache, and return the response. Note that the proxy MAY
   forward the request on to another proxy or directly to the server



Fielding, et al.            Standards Track                    [Page 36]

RFC 2616                        HTTP/1.1                       June 1999


   specified by the absoluteURI. In order to avoid request loops, a
   proxy MUST be able to recognize all of its server names, including
   any aliases, local variations, and the numeric IP address. An example
   Request-Line would be:

       GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

   To allow for transition to absoluteURIs in all requests in future
   versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI
   form in requests, even though HTTP/1.1 clients will only generate
   them in requests to proxies.

   The authority form is only used by the CONNECT method (section 9.9).

   The most common form of Request-URI is that used to identify a
   resource on an origin server or gateway. In this case the absolute
   path of the URI MUST be transmitted (see section 3.2.1, abs_path) as
   the Request-URI, and the network location of the URI (authority) MUST
   be transmitted in a Host header field. For example, a client wishing
   to retrieve the resource above directly from the origin server would
   create a TCP connection to port 80 of the host "www.w3.org" and send
   the lines:

       GET /pub/WWW/TheProject.html HTTP/1.1
       Host: www.w3.org

   followed by the remainder of the Request. Note that the absolute path
   cannot be empty; if none is present in the original URI, it MUST be
   given as "/" (the server root).

   The Request-URI is transmitted in the format specified in section
   3.2.1. If the Request-URI is encoded using the "% HEX HEX" encoding
   [42], the origin server MUST decode the Request-URI in order to
   properly interpret the request. Servers SHOULD respond to invalid
   Request-URIs with an appropriate status code.

   A transparent proxy MUST NOT rewrite the "abs_path" part of the
   received Request-URI when forwarding it to the next inbound server,
   except as noted above to replace a null abs_path with "/".

      Note: The "no rewrite" rule prevents the proxy from changing the
      meaning of the request when the origin server is improperly using
      a non-reserved URI character for a reserved purpose.  Implementors
      should be aware that some pre-HTTP/1.1 proxies have been known to
      rewrite the Request-URI.






Fielding, et al.            Standards Track                    [Page 37]

RFC 2616                        HTTP/1.1                       June 1999


5.2 The Resource Identified by a Request

   The exact resource identified by an Internet request is determined by
   examining both the Request-URI and the Host header field.

   An origin server that does not allow resources to differ by the
   requested host MAY ignore the Host header field value when
   determining the resource identified by an HTTP/1.1 request. (But see
   section 19.6.1.1 for other requirements on Host support in HTTP/1.1.)

   An origin server that does differentiate resources based on the host
   requested (sometimes referred to as virtual hosts or vanity host
   names) MUST use the following rules for determining the requested
   resource on an HTTP/1.1 request:

   1. If Request-URI is an absoluteURI, the host is part of the
     Request-URI. Any Host header field value in the request MUST be
     ignored.

   2. If the Request-URI is not an absoluteURI, and the request includes
     a Host header field, the host is determined by the Host header
     field value.

   3. If the host as determined by rule 1 or 2 is not a valid host on
     the server, the response MUST be a 400 (Bad Request) error message.

   Recipients of an HTTP/1.0 request that lacks a Host header field MAY
   attempt to use heuristics (e.g., examination of the URI path for
   something unique to a particular host) in order to determine what
   exact resource is being requested.

5.3 Request Header Fields

   The request-header fields allow the client to pass additional
   information about the request, and about the client itself, to the
   server. These fields act as request modifiers, with semantics
   equivalent to the parameters on a programming language method
   invocation.

       request-header = Accept                   ; Section 14.1
                      | Accept-Charset           ; Section 14.2
                      | Accept-Encoding          ; Section 14.3
                      | Accept-Language          ; Section 14.4
                      | Authorization            ; Section 14.8
                      | Expect                   ; Section 14.20
                      | From                     ; Section 14.22
                      | Host                     ; Section 14.23
                      | If-Match                 ; Section 14.24



Fielding, et al.            Standards Track                    [Page 38]

RFC 2616                        HTTP/1.1                       June 1999


                      | If-Modified-Since        ; Section 14.25
                      | If-None-Match            ; Section 14.26
                      | If-Range                 ; Section 14.27
                      | If-Unmodified-Since      ; Section 14.28
                      | Max-Forwards             ; Section 14.31
                      | Proxy-Authorization      ; Section 14.34
                      | Range                    ; Section 14.35
                      | Referer                  ; Section 14.36
                      | TE                       ; Section 14.39
                      | User-Agent               ; Section 14.43

   Request-header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields MAY be given the semantics of request-
   header fields if all parties in the communication recognize them to
   be request-header fields. Unrecognized header fields are treated as
   entity-header fields.

6 Response

   After receiving and interpreting a request message, a server responds
   with an HTTP response message.

       Response      = Status-Line               ; Section 6.1
                       *(( general-header        ; Section 4.5
                        | response-header        ; Section 6.2
                        | entity-header ) CRLF)  ; Section 7.1
                       CRLF
                       [ message-body ]          ; Section 7.2

6.1 Status-Line

   The first line of a Response message is the Status-Line, consisting
   of the protocol version followed by a numeric status code and its
   associated textual phrase, with each element separated by SP
   characters. No CR or LF is allowed except in the final CRLF sequence.

       Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

6.1.1 Status Code and Reason Phrase

   The Status-Code element is a 3-digit integer result code of the
   attempt to understand and satisfy the request. These codes are fully
   defined in section 10. The Reason-Phrase is intended to give a short
   textual description of the Status-Code. The Status-Code is intended
   for use by automata and the Reason-Phrase is intended for the human
   user. The client is not required to examine or display the Reason-
   Phrase.



Fielding, et al.            Standards Track                    [Page 39]

RFC 2616                        HTTP/1.1                       June 1999


   The first digit of the Status-Code defines the class of response. The
   last two digits do not have any categorization role. There are 5
   values for the first digit:

      - 1xx: Informational - Request received, continuing process

      - 2xx: Success - The action was successfully received,
        understood, and accepted

      - 3xx: Redirection - Further action must be taken in order to
        complete the request

      - 4xx: Client Error - The request contains bad syntax or cannot
        be fulfilled

      - 5xx: Server Error - The server failed to fulfill an apparently
        valid request

   The individual values of the numeric status codes defined for
   HTTP/1.1, and an example set of corresponding Reason-Phrase's, are
   presented below. The reason phrases listed here are only
   recommendations -- they MAY be replaced by local equivalents without
   affecting the protocol.

      Status-Code    =
            "100"  ; Section 10.1.1: Continue
          | "101"  ; Section 10.1.2: Switching Protocols
          | "200"  ; Section 10.2.1: OK
          | "201"  ; Section 10.2.2: Created
          | "202"  ; Section 10.2.3: Accepted
          | "203"  ; Section 10.2.4: Non-Authoritative Information
          | "204"  ; Section 10.2.5: No Content
          | "205"  ; Section 10.2.6: Reset Content
          | "206"  ; Section 10.2.7: Partial Content
          | "300"  ; Section 10.3.1: Multiple Choices
          | "301"  ; Section 10.3.2: Moved Permanently
          | "302"  ; Section 10.3.3: Found
          | "303"  ; Section 10.3.4: See Other
          | "304"  ; Section 10.3.5: Not Modified
          | "305"  ; Section 10.3.6: Use Proxy
          | "307"  ; Section 10.3.8: Temporary Redirect
          | "400"  ; Section 10.4.1: Bad Request
          | "401"  ; Section 10.4.2: Unauthorized
          | "402"  ; Section 10.4.3: Payment Required
          | "403"  ; Section 10.4.4: Forbidden
          | "404"  ; Section 10.4.5: Not Found
          | "405"  ; Section 10.4.6: Method Not Allowed
          | "406"  ; Section 10.4.7: Not Acceptable



Fielding, et al.            Standards Track                    [Page 40]

RFC 2616                        HTTP/1.1                       June 1999


          | "407"  ; Section 10.4.8: Proxy Authentication Required
          | "408"  ; Section 10.4.9: Request Time-out
          | "409"  ; Section 10.4.10: Conflict
          | "410"  ; Section 10.4.11: Gone
          | "411"  ; Section 10.4.12: Length Required
          | "412"  ; Section 10.4.13: Precondition Failed
          | "413"  ; Section 10.4.14: Request Entity Too Large
          | "414"  ; Section 10.4.15: Request-URI Too Large
          | "415"  ; Section 10.4.16: Unsupported Media Type
          | "416"  ; Section 10.4.17: Requested range not satisfiable
          | "417"  ; Section 10.4.18: Expectation Failed
          | "500"  ; Section 10.5.1: Internal Server Error
          | "501"  ; Section 10.5.2: Not Implemented
          | "502"  ; Section 10.5.3: Bad Gateway
          | "503"  ; Section 10.5.4: Service Unavailable
          | "504"  ; Section 10.5.5: Gateway Time-out
          | "505"  ; Section 10.5.6: HTTP Version not supported
          | extension-code

      extension-code = 3DIGIT
      Reason-Phrase  = *<TEXT, excluding CR, LF>

   HTTP status codes are extensible. HTTP applications are not required
   to understand the meaning of all registered status codes, though such
   understanding is obviously desirable. However, applications MUST
   understand the class of any status code, as indicated by the first
   digit, and treat any unrecognized response as being equivalent to the
   x00 status code of that class, with the exception that an
   unrecognized response MUST NOT be cached. For example, if an
   unrecognized status code of 431 is received by the client, it can
   safely assume that there was something wrong with its request and
   treat the response as if it had received a 400 status code. In such
   cases, user agents SHOULD present to the user the entity returned
   with the response, since that entity is likely to include human-
   readable information which will explain the unusual status.

6.2 Response Header Fields

   The response-header fields allow the server to pass additional
   information about the response which cannot be placed in the Status-
   Line. These header fields give information about the server and about
   further access to the resource identified by the Request-URI.

       response-header = Accept-Ranges           ; Section 14.5
                       | Age                     ; Section 14.6
                       | ETag                    ; Section 14.19
                       | Location                ; Section 14.30
                       | Proxy-Authenticate      ; Section 14.33



Fielding, et al.            Standards Track                    [Page 41]

RFC 2616                        HTTP/1.1                       June 1999


                       | Retry-After             ; Section 14.37
                       | Server                  ; Section 14.38
                       | Vary                    ; Section 14.44
                       | WWW-Authenticate        ; Section 14.47

   Response-header field names can be extended reliably only in
   combination with a change in the protocol version. However, new or
   experimental header fields MAY be given the semantics of response-
   header fields if all parties in the communication recognize them to
   be response-header fields. Unrecognized header fields are treated as
   entity-header fields.

7 Entity

   Request and Response messages MAY transfer an entity if not otherwise
   restricted by the request method or response status code. An entity
   consists of entity-header fields and an entity-body, although some
   responses will only include the entity-headers.

   In this section, both sender and recipient refer to either the client
   or the server, depending on who sends and who receives the entity.

7.1 Entity Header Fields

   Entity-header fields define metainformation about the entity-body or,
   if no body is present, about the resource identified by the request.
   Some of this metainformation is OPTIONAL; some might be REQUIRED by
   portions of this specification.

       entity-header  = Allow                    ; Section 14.7
                      | Content-Encoding         ; Section 14.11
                      | Content-Language         ; Section 14.12
                      | Content-Length           ; Section 14.13
                      | Content-Location         ; Section 14.14
                      | Content-MD5              ; Section 14.15
                      | Content-Range            ; Section 14.16
                      | Content-Type             ; Section 14.17
                      | Expires                  ; Section 14.21
                      | Last-Modified            ; Section 14.29
                      | extension-header

       extension-header = message-header

   The extension-header mechanism allows additional entity-header fields
   to be defined without changing the protocol, but these fields cannot
   be assumed to be recognizable by the recipient. Unrecognized header
   fields SHOULD be ignored by the recipient and MUST be forwarded by
   transparent proxies.



Fielding, et al.            Standards Track                    [Page 42]

RFC 2616                        HTTP/1.1                       June 1999


7.2 Entity Body

   The entity-body (if any) sent with an HTTP request or response is in
   a format and encoding defined by the entity-header fields.

       entity-body    = *OCTET

   An entity-body is only present in a message when a message-body is
   present, as described in section 4.3. The entity-body is obtained
   from the message-body by decoding any Transfer-Encoding that might
   have been applied to ensure safe and proper transfer of the message.

7.2.1 Type

   When an entity-body is included with a message, the data type of that
   body is determined via the header fields Content-Type and Content-
   Encoding. These define a two-layer, ordered encoding model:

       entity-body := Content-Encoding( Content-Type( data ) )

   Content-Type specifies the media type of the underlying data.
   Content-Encoding may be used to indicate any additional content
   codings applied to the data, usually for the purpose of data
   compression, that are a property of the requested resource. There is
   no default encoding.

   Any HTTP/1.1 message containing an entity-body SHOULD include a
   Content-Type header field defining the media type of that body. If
   and only if the media type is not given by a Content-Type field, the
   recipient MAY attempt to guess the media type via inspection of its
   content and/or the name extension(s) of the URI used to identify the
   resource. If the media type remains unknown, the recipient SHOULD
   treat it as type "application/octet-stream".

7.2.2 Entity Length

   The entity-length of a message is the length of the message-body
   before any transfer-codings have been applied. Section 4.4 defines
   how the transfer-length of a message-body is determined.












Fielding, et al.            Standards Track                    [Page 43]

RFC 2616                        HTTP/1.1                       June 1999


8 Connections

8.1 Persistent Connections

8.1.1 Purpose

   Prior to persistent connections, a separate TCP connection was
   established to fetch each URL, increasing the load on HTTP servers
   and causing congestion on the Internet. The use of inline images and
   other associated data often require a client to make multiple
   requests of the same server in a short amount of time. Analysis of
   these performance problems and results from a prototype
   implementation are available [26] [30]. Implementation experience and
   measurements of actual HTTP/1.1 (RFC 2068) implementations show good
   results [39]. Alternatives have also been explored, for example,
   T/TCP [27].

   Persistent HTTP connections have a number of advantages:

      - By opening and closing fewer TCP connections, CPU time is saved
        in routers and hosts (clients, servers, proxies, gateways,
        tunnels, or caches), and memory used for TCP protocol control
        blocks can be saved in hosts.

      - HTTP requests and responses can be pipelined on a connection.
        Pipelining allows a client to make multiple requests without
        waiting for each response, allowing a single TCP connection to
        be used much more efficiently, with much lower elapsed time.

      - Network congestion is reduced by reducing the number of packets
        caused by TCP opens, and by allowing TCP sufficient time to
        determine the congestion state of the network.

      - Latency on subsequent requests is reduced since there is no time
        spent in TCP's connection opening handshake.

      - HTTP can evolve more gracefully, since errors can be reported
        without the penalty of closing the TCP connection. Clients using
        future versions of HTTP might optimistically try a new feature,
        but if communicating with an older server, retry with old
        semantics after an error is reported.

   HTTP implementations SHOULD implement persistent connections.








Fielding, et al.            Standards Track                    [Page 44]

RFC 2616                        HTTP/1.1                       June 1999


8.1.2 Overall Operation

   A significant difference between HTTP/1.1 and earlier versions of
   HTTP is that persistent connections are the default behavior of any
   HTTP connection. That is, unless otherwise indicated, the client
   SHOULD assume that the server will maintain a persistent connection,
   even after error responses from the server.

   Persistent connections provide a mechanism by which a client and a
   server can signal the close of a TCP connection. This signaling takes
   place using the Connection header field (section 14.10). Once a close
   has been signaled, the client MUST NOT send any more requests on that
   connection.

8.1.2.1 Negotiation

   An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
   maintain a persistent connection unless a Connection header including
   the connection-token "close" was sent in the request. If the server
   chooses to close the connection immediately after sending the
   response, it SHOULD send a Connection header including the
   connection-token close.

   An HTTP/1.1 client MAY expect a connection to remain open, but would
   decide to keep it open based on whether the response from a server
   contains a Connection header with the connection-token close. In case
   the client does not want to maintain a connection for more than that
   request, it SHOULD send a Connection header including the
   connection-token close.

   If either the client or the server sends the close token in the
   Connection header, that request becomes the last one for the
   connection.

   Clients and servers SHOULD NOT assume that a persistent connection is
   maintained for HTTP versions less than 1.1 unless it is explicitly
   signaled. See section 19.6.2 for more information on backward
   compatibility with HTTP/1.0 clients.

   In order to remain persistent, all messages on the connection MUST
   have a self-defined message length (i.e., one not defined by closure
   of the connection), as described in section 4.4.









Fielding, et al.            Standards Track                    [Page 45]

RFC 2616                        HTTP/1.1                       June 1999


8.1.2.2 Pipelining

   A client that supports persistent connections MAY "pipeline" its
   requests (i.e., send multiple requests without waiting for each
   response). A server MUST send its responses to those requests in the
   same order that the requests were received.

   Clients which assume persistent connections and pipeline immediately
   after connection establishment SHOULD be prepared to retry their
   connection if the first pipelined attempt fails. If a client does
   such a retry, it MUST NOT pipeline before it knows the connection is
   persistent. Clients MUST also be prepared to resend their requests if
   the server closes the connection before sending all of the
   corresponding responses.

   Clients SHOULD NOT pipeline requests using non-idempotent methods or
   non-idempotent sequences of methods (see section 9.1.2). Otherwise, a
   premature termination of the transport connection could lead to
   indeterminate results. A client wishing to send a non-idempotent
   request SHOULD wait to send that request until it has received the
   response status for the previous request.

8.1.3 Proxy Servers

   It is especially important that proxies correctly implement the
   properties of the Connection header field as specified in section
   14.10.

   The proxy server MUST signal persistent connections separately with
   its clients and the origin servers (or other proxy servers) that it
   connects to. Each persistent connection applies to only one transport
   link.

   A proxy server MUST NOT establish a HTTP/1.1 persistent connection
   with an HTTP/1.0 client (but see RFC 2068 [33] for information and
   discussion of the problems with the Keep-Alive header implemented by
   many HTTP/1.0 clients).

8.1.4 Practical Considerations

   Servers will usually have some time-out value beyond which they will
   no longer maintain an inactive connection. Proxy servers might make
   this a higher value since it is likely that the client will be making
   more connections through the same server. The use of persistent
   connections places no requirements on the length (or existence) of
   this time-out for either the client or the server.





Fielding, et al.            Standards Track                    [Page 46]

RFC 2616                        HTTP/1.1                       June 1999


   When a client or server wishes to time-out it SHOULD issue a graceful
   close on the transport connection. Clients and servers SHOULD both
   constantly watch for the other side of the transport close, and
   respond to it as appropriate. If a client or server does not detect
   the other side's close promptly it could cause unnecessary resource
   drain on the network.

   A client, server, or proxy MAY close the transport connection at any
   time. For example, a client might have started to send a new request
   at the same time that the server has decided to close the "idle"
   connection. From the server's point of view, the connection is being
   closed while it was idle, but from the client's point of view, a
   request is in progress.

   This means that clients, servers, and proxies MUST be able to recover
   from asynchronous close events. Client software SHOULD reopen the
   transport connection and retransmit the aborted sequence of requests
   without user interaction so long as the request sequence is
   idempotent (see section 9.1.2). Non-idempotent methods or sequences
   MUST NOT be automatically retried, although user agents MAY offer a
   human operator the choice of retrying the request(s). Confirmation by
   user-agent software with semantic understanding of the application
   MAY substitute for user confirmation. The automatic retry SHOULD NOT
   be repeated if the second sequence of requests fails.

   Servers SHOULD always respond to at least one request per connection,
   if at all possible. Servers SHOULD NOT close a connection in the
   middle of transmitting a response, unless a network or client failure
   is suspected.

   Clients that use persistent connections SHOULD limit the number of
   simultaneous connections that they maintain to a given server. A
   single-user client SHOULD NOT maintain more than 2 connections with
   any server or proxy. A proxy SHOULD use up to 2*N connections to
   another server or proxy, where N is the number of simultaneously
   active users. These guidelines are intended to improve HTTP response
   times and avoid congestion.

8.2 Message Transmission Requirements

8.2.1 Persistent Connections and Flow Control

   HTTP/1.1 servers SHOULD maintain persistent connections and use TCP's
   flow control mechanisms to resolve temporary overloads, rather than
   terminating connections with the expectation that clients will retry.
   The latter technique can exacerbate network congestion.





Fielding, et al.            Standards Track                    [Page 47]

RFC 2616                        HTTP/1.1                       June 1999


8.2.2 Monitoring Connections for Error Status Messages

   An HTTP/1.1 (or later) client sending a message-body SHOULD monitor
   the network connection for an error status while it is transmitting
   the request. If the client sees an error status, it SHOULD
   immediately cease transmitting the body. If the body is being sent
   using a "chunked" encoding (section 3.6), a zero length chunk and
   empty trailer MAY be used to prematurely mark the end of the message.
   If the body was preceded by a Content-Length header, the client MUST
   close the connection.

8.2.3 Use of the 100 (Continue) Status

   The purpose of the 100 (Continue) status (see section 10.1.1) is to
   allow a client that is sending a request message with a request body
   to determine if the origin server is willing to accept the request
   (based on the request headers) before the client sends the request
   body. In some cases, it might either be inappropriate or highly
   inefficient for the client to send the body if the server will reject
   the message without looking at the body.

   Requirements for HTTP/1.1 clients:

      - If a client will wait for a 100 (Continue) response before
        sending the request body, it MUST send an Expect request-header
        field (section 14.20) with the "100-continue" expectation.

      - A client MUST NOT send an Expect request-header field (section
        14.20) with the "100-continue" expectation if it does not intend
        to send a request body.

   Because of the presence of older implementations, the protocol allows
   ambiguous situations in which a client may send "Expect: 100-
   continue" without receiving either a 417 (Expectation Failed) status
   or a 100 (Continue) status. Therefore, when a client sends this
   header field to an origin server (possibly via a proxy) from which it
   has never seen a 100 (Continue) status, the client SHOULD NOT wait
   for an indefinite period before sending the request body.

   Requirements for HTTP/1.1 origin servers:

      - Upon receiving a request which includes an Expect request-header
        field with the "100-continue" expectation, an origin server MUST
        either respond with 100 (Continue) status and continue to read
        from the input stream, or respond with a final status code. The
        origin server MUST NOT wait for the request body before sending
        the 100 (Continue) response. If it responds with a final status
        code, it MAY close the transport connection or it MAY continue



Fielding, et al.            Standards Track                    [Page 48]

RFC 2616                        HTTP/1.1                       June 1999


        to read and discard the rest of the request.  It MUST NOT
        perform the requested method if it returns a final status code.

      - An origin server SHOULD NOT send a 100 (Continue) response if
        the request message does not include an Expect request-header
        field with the "100-continue" expectation, and MUST NOT send a
        100 (Continue) response if such a request comes from an HTTP/1.0
        (or earlier) client. There is an exception to this rule: for
        compatibility with RFC 2068, a server MAY send a 100 (Continue)
        status in response to an HTTP/1.1 PUT or POST request that does
        not include an Expect request-header field with the "100-
        continue" expectation. This exception, the purpose of which is
        to minimize any client processing delays associated with an
        undeclared wait for 100 (Continue) status, applies only to
        HTTP/1.1 requests, and not to requests with any other HTTP-
        version value.

      - An origin server MAY omit a 100 (Continue) response if it has
        already received some or all of the request body for the
        corresponding request.

      - An origin server that sends a 100 (Continue) response MUST
        ultimately send a final status code, once the request body is
        received and processed, unless it terminates the transport
        connection prematurely.

      - If an origin server receives a request that does not include an
        Expect request-header field with the "100-continue" expectation,
        the request includes a request body, and the server responds
        with a final status code before reading the entire request body
        from the transport connection, then the server SHOULD NOT close
        the transport connection until it has read the entire request,
        or until the client closes the connection. Otherwise, the client
        might not reliably receive the response message. However, this
        requirement is not be construed as preventing a server from
        defending itself against denial-of-service attacks, or from
        badly broken client implementations.

   Requirements for HTTP/1.1 proxies:

      - If a proxy receives a request that includes an Expect request-
        header field with the "100-continue" expectation, and the proxy
        either knows that the next-hop server complies with HTTP/1.1 or
        higher, or does not know the HTTP version of the next-hop
        server, it MUST forward the request, including the Expect header
        field.





Fielding, et al.            Standards Track                    [Page 49]

RFC 2616                        HTTP/1.1                       June 1999


      - If the proxy knows that the version of the next-hop server is
        HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST
        respond with a 417 (Expectation Failed) status.

      - Proxies SHOULD maintain a cache recording the HTTP version
        numbers received from recently-referenced next-hop servers.

      - A proxy MUST NOT forward a 100 (Continue) response if the
        request message was received from an HTTP/1.0 (or earlier)
        client and did not include an Expect request-header field with
        the "100-continue" expectation. This requirement overrides the
        general rule for forwarding of 1xx responses (see section 10.1).

8.2.4 Client Behavior if Server Prematurely Closes Connection

   If an HTTP/1.1 client sends a request which includes a request body,
   but which does not include an Expect request-header field with the
   "100-continue" expectation, and if the client is not directly
   connected to an HTTP/1.1 origin server, and if the client sees the
   connection close before receiving any status from the server, the
   client SHOULD retry the request.  If the client does retry this
   request, it MAY use the following "binary exponential backoff"
   algorithm to be assured of obtaining a reliable response:

      1. Initiate a new connection to the server

      2. Transmit the request-headers

      3. Initialize a variable R to the estimated round-trip time to the
         server (e.g., based on the time it took to establish the
         connection), or to a constant value of 5 seconds if the round-
         trip time is not available.

      4. Compute T = R * (2**N), where N is the number of previous
         retries of this request.

      5. Wait either for an error response from the server, or for T
         seconds (whichever comes first)

      6. If no error response is received, after T seconds transmit the
         body of the request.

      7. If client sees that the connection is closed prematurely,
         repeat from step 1 until the request is accepted, an error
         response is received, or the user becomes impatient and
         terminates the retry process.





Fielding, et al.            Standards Track                    [Page 50]

RFC 2616                        HTTP/1.1                       June 1999


   If at any point an error status is received, the client

      - SHOULD NOT continue and

      - SHOULD close the connection if it has not completed sending the
        request message.

9 Method Definitions

   The set of common methods for HTTP/1.1 is defined below. Although
   this set can be expanded, additional methods cannot be assumed to
   share the same semantics for separately extended clients and servers.

   The Host request-header field (section 14.23) MUST accompany all
   HTTP/1.1 requests.

9.1 Safe and Idempotent Methods

9.1.1 Safe Methods

   Implementors should be aware that the software represents the user in
   their interactions over the Internet, and should be careful to allow
   the user to be aware of any actions they might take which may have an
   unexpected significance to themselves or others.

   In particular, the convention has been established that the GET and
   HEAD methods SHOULD NOT have the significance of taking an action
   other than retrieval. These methods ought to be considered "safe".
   This allows user agents to represent other methods, such as POST, PUT
   and DELETE, in a special way, so that the user is made aware of the
   fact that a possibly unsafe action is being requested.

   Naturally, it is not possible to ensure that the server does not
   generate side-effects as a result of performing a GET request; in
   fact, some dynamic resources consider that a feature. The important
   distinction here is that the user did not request the side-effects,
   so therefore cannot be held accountable for them.

9.1.2 Idempotent Methods

   Methods can also have the property of "idempotence" in that (aside
   from error or expiration issues) the side-effects of N > 0 identical
   requests is the same as for a single request. The methods GET, HEAD,
   PUT and DELETE share this property. Also, the methods OPTIONS and
   TRACE SHOULD NOT have side effects, and so are inherently idempotent.






Fielding, et al.            Standards Track                    [Page 51]

RFC 2616                        HTTP/1.1                       June 1999


   However, it is possible that a sequence of several requests is non-
   idempotent, even if all of the methods executed in that sequence are
   idempotent. (A sequence is idempotent if a single execution of the
   entire sequence always yields a result that is not changed by a
   reexecution of all, or part, of that sequence.) For example, a
   sequence is non-idempotent if its result depends on a value that is
   later modified in the same sequence.

   A sequence that never has side effects is idempotent, by definition
   (provided that no concurrent operations are being executed on the
   same set of resources).

9.2 OPTIONS

   The OPTIONS method represents a request for information about the
   communication options available on the request/response chain
   identified by the Request-URI. This method allows the client to
   determine the options and/or requirements associated with a resource,
   or the capabilities of a server, without implying a resource action
   or initiating a resource retrieval.

   Responses to this method are not cacheable.

   If the OPTIONS request includes an entity-body (as indicated by the
   presence of Content-Length or Transfer-Encoding), then the media type
   MUST be indicated by a Content-Type field. Although this
   specification does not define any use for such a body, future
   extensions to HTTP might use the OPTIONS body to make more detailed
   queries on the server. A server that does not support such an
   extension MAY discard the request body.

   If the Request-URI is an asterisk ("*"), the OPTIONS request is
   intended to apply to the server in general rather than to a specific
   resource. Since a server's communication options typically depend on
   the resource, the "*" request is only useful as a "ping" or "no-op"
   type of method; it does nothing beyond allowing the client to test
   the capabilities of the server. For example, this can be used to test
   a proxy for HTTP/1.1 compliance (or lack thereof).

   If the Request-URI is not an asterisk, the OPTIONS request applies
   only to the options that are available when communicating with that
   resource.

   A 200 response SHOULD include any header fields that indicate
   optional features implemented by the server and applicable to that
   resource (e.g., Allow), possibly including extensions not defined by
   this specification. The response body, if any, SHOULD also include
   information about the communication options. The format for such a



Fielding, et al.            Standards Track                    [Page 52]

RFC 2616                        HTTP/1.1                       June 1999


   body is not defined by this specification, but might be defined by
   future extensions to HTTP. Content negotiation MAY be used to select
   the appropriate response format. If no response body is included, the
   response MUST include a Content-Length field with a field-value of
   "0".

   The Max-Forwards request-header field MAY be used to target a
   specific proxy in the request chain. When a proxy receives an OPTIONS
   request on an absoluteURI for which request forwarding is permitted,
   the proxy MUST check for a Max-Forwards field. If the Max-Forwards
   field-value is zero ("0"), the proxy MUST NOT forward the message;
   instead, the proxy SHOULD respond with its own communication options.
   If the Max-Forwards field-value is an integer greater than zero, the
   proxy MUST decrement the field-value when it forwards the request. If
   no Max-Forwards field is present in the request, then the forwarded
   request MUST NOT include a Max-Forwards field.

9.3 GET

   The GET method means retrieve whatever information (in the form of an
   entity) is identified by the Request-URI. If the Request-URI refers
   to a data-producing process, it is the produced data which shall be
   returned as the entity in the response and not the source text of the
   process, unless that text happens to be the output of the process.

   The semantics of the GET method change to a "conditional GET" if the
   request message includes an If-Modified-Since, If-Unmodified-Since,
   If-Match, If-None-Match, or If-Range header field. A conditional GET
   method requests that the entity be transferred only under the
   circumstances described by the conditional header field(s). The
   conditional GET method is intended to reduce unnecessary network
   usage by allowing cached entities to be refreshed without requiring
   multiple requests or transferring data already held by the client.

   The semantics of the GET method change to a "partial GET" if the
   request message includes a Range header field. A partial GET requests
   that only part of the entity be transferred, as described in section
   14.35. The partial GET method is intended to reduce unnecessary
   network usage by allowing partially-retrieved entities to be
   completed without transferring data already held by the client.

   The response to a GET request is cacheable if and only if it meets
   the requirements for HTTP caching described in section 13.

   See section 15.1.3 for security considerations when used for forms.






Fielding, et al.            Standards Track                    [Page 53]

RFC 2616                        HTTP/1.1                       June 1999


9.4 HEAD

   The HEAD method is identical to GET except that the server MUST NOT
   return a message-body in the response. The metainformation contained
   in the HTTP headers in response to a HEAD request SHOULD be identical
   to the information sent in response to a GET request. This method can
   be used for obtaining metainformation about the entity implied by the
   request without transferring the entity-body itself. This method is
   often used for testing hypertext links for validity, accessibility,
   and recent modification.

   The response to a HEAD request MAY be cacheable in the sense that the
   information contained in the response MAY be used to update a
   previously cached entity from that resource. If the new field values
   indicate that the cached entity differs from the current entity (as
   would be indicated by a change in Content-Length, Content-MD5, ETag
   or Last-Modified), then the cache MUST treat the cache entry as
   stale.

9.5 POST

   The POST method is used to request that the origin server accept the
   entity enclosed in the request as a new subordinate of the resource
   identified by the Request-URI in the Request-Line. POST is designed
   to allow a uniform method to cover the following functions:

      - Annotation of existing resources;

      - Posting a message to a bulletin board, newsgroup, mailing list,
        or similar group of articles;

      - Providing a block of data, such as the result of submitting a
        form, to a data-handling process;

      - Extending a database through an append operation.

   The actual function performed by the POST method is determined by the
   server and is usually dependent on the Request-URI. The posted entity
   is subordinate to that URI in the same way that a file is subordinate
   to a directory containing it, a news article is subordinate to a
   newsgroup to which it is posted, or a record is subordinate to a
   database.

   The action performed by the POST method might not result in a
   resource that can be identified by a URI. In this case, either 200
   (OK) or 204 (No Content) is the appropriate response status,
   depending on whether or not the response includes an entity that
   describes the result.



Fielding, et al.            Standards Track                    [Page 54]

RFC 2616                        HTTP/1.1                       June 1999


   If a resource has been created on the origin server, the response
   SHOULD be 201 (Created) and contain an entity which describes the
   status of the request and refers to the new resource, and a Location
   header (see section 14.30).

   Responses to this method are not cacheable, unless the response
   includes appropriate Cache-Control or Expires header fields. However,
   the 303 (See Other) response can be used to direct the user agent to
   retrieve a cacheable resource.

   POST requests MUST obey the message transmission requirements set out
   in section 8.2.

   See section 15.1.3 for security considerations.

9.6 PUT

   The PUT method requests that the enclosed entity be stored under the
   supplied Request-URI. If the Request-URI refers to an already
   existing resource, the enclosed entity SHOULD be considered as a
   modified version of the one residing on the origin server. If the
   Request-URI does not point to an existing resource, and that URI is
   capable of being defined as a new resource by the requesting user
   agent, the origin server can create the resource with that URI. If a
   new resource is created, the origin server MUST inform the user agent
   via the 201 (Created) response. If an existing resource is modified,
   either the 200 (OK) or 204 (No Content) response codes SHOULD be sent
   to indicate successful completion of the request. If the resource
   could not be created or modified with the Request-URI, an appropriate
   error response SHOULD be given that reflects the nature of the
   problem. The recipient of the entity MUST NOT ignore any Content-*
   (e.g. Content-Range) headers that it does not understand or implement
   and MUST return a 501 (Not Implemented) response in such cases.

   If the request passes through a cache and the Request-URI identifies
   one or more currently cached entities, those entries SHOULD be
   treated as stale. Responses to this method are not cacheable.

   The fundamental difference between the POST and PUT requests is
   reflected in the different meaning of the Request-URI. The URI in a
   POST request identifies the resource that will handle the enclosed
   entity. That resource might be a data-accepting process, a gateway to
   some other protocol, or a separate entity that accepts annotations.
   In contrast, the URI in a PUT request identifies the entity enclosed
   with the request -- the user agent knows what URI is intended and the
   server MUST NOT attempt to apply the request to some other resource.
   If the server desires that the request be applied to a different URI,




Fielding, et al.            Standards Track                    [Page 55]

RFC 2616                        HTTP/1.1                       June 1999


   it MUST send a 301 (Moved Permanently) response; the user agent MAY
   then make its own decision regarding whether or not to redirect the
   request.

   A single resource MAY be identified by many different URIs. For
   example, an article might have a URI for identifying "the current
   version" which is separate from the URI identifying each particular
   version. In this case, a PUT request on a general URI might result in
   several other URIs being defined by the origin server.

   HTTP/1.1 does not define how a PUT method affects the state of an
   origin server.

   PUT requests MUST obey the message transmission requirements set out
   in section 8.2.

   Unless otherwise specified for a particular entity-header, the
   entity-headers in the PUT request SHOULD be applied to the resource
   created or modified by the PUT.

9.7 DELETE

   The DELETE method requests that the origin server delete the resource
   identified by the Request-URI. This method MAY be overridden by human
   intervention (or other means) on the origin server. The client cannot
   be guaranteed that the operation has been carried out, even if the
   status code returned from the origin server indicates that the action
   has been completed successfully. However, the server SHOULD NOT
   indicate success unless, at the time the response is given, it
   intends to delete the resource or move it to an inaccessible
   location.

   A successful response SHOULD be 200 (OK) if the response includes an
   entity describing the status, 202 (Accepted) if the action has not
   yet been enacted, or 204 (No Content) if the action has been enacted
   but the response does not include an entity.

   If the request passes through a cache and the Request-URI identifies
   one or more currently cached entities, those entries SHOULD be
   treated as stale. Responses to this method are not cacheable.

9.8 TRACE

   The TRACE method is used to invoke a remote, application-layer loop-
   back of the request message. The final recipient of the request
   SHOULD reflect the message received back to the client as the
   entity-body of a 200 (OK) response. The final recipient is either the




Fielding, et al.            Standards Track                    [Page 56]

RFC 2616                        HTTP/1.1                       June 1999


   origin server or the first proxy or gateway to receive a Max-Forwards
   value of zero (0) in the request (see section 14.31). A TRACE request
   MUST NOT include an entity.

   TRACE allows the client to see what is being received at the other
   end of the request chain and use that data for testing or diagnostic
   information. The value of the Via header field (section 14.45) is of
   particular interest, since it acts as a trace of the request chain.
   Use of the Max-Forwards header field allows the client to limit the
   length of the request chain, which is useful for testing a chain of
   proxies forwarding messages in an infinite loop.

   If the request is valid, the response SHOULD contain the entire
   request message in the entity-body, with a Content-Type of
   "message/http". Responses to this method MUST NOT be cached.

9.9 CONNECT

   This specification reserves the method name CONNECT for use with a
   proxy that can dynamically switch to being a tunnel (e.g. SSL
   tunneling [44]).

10 Status Code Definitions

   Each Status-Code is described below, including a description of which
   method(s) it can follow and any metainformation required in the
   response.

10.1 Informational 1xx

   This class of status code indicates a provisional response,
   consisting only of the Status-Line and optional headers, and is
   terminated by an empty line. There are no required headers for this
   class of status code. Since HTTP/1.0 did not define any 1xx status
   codes, servers MUST NOT send a 1xx response to an HTTP/1.0 client
   except under experimental conditions.

   A client MUST be prepared to accept one or more 1xx status responses
   prior to a regular response, even if the client does not expect a 100
   (Continue) status message. Unexpected 1xx status responses MAY be
   ignored by a user agent.

   Proxies MUST forward 1xx responses, unless the connection between the
   proxy and its client has been closed, or unless the proxy itself
   requested the generation of the 1xx response. (For example, if a






Fielding, et al.            Standards Track                    [Page 57]

RFC 2616                        HTTP/1.1                       June 1999


   proxy adds a "Expect: 100-continue" field when it forwards a request,
   then it need not forward the corresponding 100 (Continue)
   response(s).)

10.1.1 100 Continue

   The client SHOULD continue with its request. This interim response is
   used to inform the client that the initial part of the request has
   been received and has not yet been rejected by the server. The client
   SHOULD continue by sending the remainder of the request or, if the
   request has already been completed, ignore this response. The server
   MUST send a final response after the request has been completed. See
   section 8.2.3 for detailed discussion of the use and handling of this
   status code.

10.1.2 101 Switching Protocols

   The server understands and is willing to comply with the client's
   request, via the Upgrade message header field (section 14.42), for a
   change in the application protocol being used on this connection. The
   server will switch protocols to those defined by the response's
   Upgrade header field immediately after the empty line which
   terminates the 101 response.

   The protocol SHOULD be switched only when it is advantageous to do
   so. For example, switching to a newer version of HTTP is advantageous
   over older versions, and switching to a real-time, synchronous
   protocol might be advantageous when delivering resources that use
   such features.

10.2 Successful 2xx

   This class of status code indicates that the client's request was
   successfully received, understood, and accepted.

10.2.1 200 OK

   The request has succeeded. The information returned with the response
   is dependent on the method used in the request, for example:

   GET    an entity corresponding to the requested resource is sent in
          the response;

   HEAD   the entity-header fields corresponding to the requested
          resource are sent in the response without any message-body;

   POST   an entity describing or containing the result of the action;




Fielding, et al.            Standards Track                    [Page 58]

RFC 2616                        HTTP/1.1                       June 1999


   TRACE  an entity containing the request message as received by the
          end server.

10.2.2 201 Created

   The request has been fulfilled and resulted in a new resource being
   created. The newly created resource can be referenced by the URI(s)
   returned in the entity of the response, with the most specific URI
   for the resource given by a Location header field. The response
   SHOULD include an entity containing a list of resource
   characteristics and location(s) from which the user or user agent can
   choose the one most appropriate. The entity format is specified by
   the media type given in the Content-Type header field. The origin
   server MUST create the resource before returning the 201 status code.
   If the action cannot be carried out immediately, the server SHOULD
   respond with 202 (Accepted) response instead.

   A 201 response MAY contain an ETag response header field indicating
   the current value of the entity tag for the requested variant just
   created, see section 14.19.

10.2.3 202 Accepted

   The request has been accepted for processing, but the processing has
   not been completed.  The request might or might not eventually be
   acted upon, as it might be disallowed when processing actually takes
   place. There is no facility for re-sending a status code from an
   asynchronous operation such as this.

   The 202 response is intentionally non-committal. Its purpose is to
   allow a server to accept a request for some other process (perhaps a
   batch-oriented process that is only run once per day) without
   requiring that the user agent's connection to the server persist
   until the process is completed. The entity returned with this
   response SHOULD include an indication of the request's current status
   and either a pointer to a status monitor or some estimate of when the
   user can expect the request to be fulfilled.

10.2.4 203 Non-Authoritative Information

   The returned metainformation in the entity-header is not the
   definitive set as available from the origin server, but is gathered
   from a local or a third-party copy. The set presented MAY be a subset
   or superset of the original version. For example, including local
   annotation information about the resource might result in a superset
   of the metainformation known by the origin server. Use of this
   response code is not required and is only appropriate when the
   response would otherwise be 200 (OK).



Fielding, et al.            Standards Track                    [Page 59]

RFC 2616                        HTTP/1.1                       June 1999


10.2.5 204 No Content

   The server has fulfilled the request but does not need to return an
   entity-body, and might want to return updated metainformation. The
   response MAY include new or updated metainformation in the form of
   entity-headers, which if present SHOULD be associated with the
   requested variant.

   If the client is a user agent, it SHOULD NOT change its document view
   from that which caused the request to be sent. This response is
   primarily intended to allow input for actions to take place without
   causing a change to the user agent's active document view, although
   any new or updated metainformation SHOULD be applied to the document
   currently in the user agent's active view.

   The 204 response MUST NOT include a message-body, and thus is always
   terminated by the first empty line after the header fields.

10.2.6 205 Reset Content

   The server has fulfilled the request and the user agent SHOULD reset
   the document view which caused the request to be sent. This response
   is primarily intended to allow input for actions to take place via
   user input, followed by a clearing of the form in which the input is
   given so that the user can easily initiate another input action. The
   response MUST NOT include an entity.

10.2.7 206 Partial Content

   The server has fulfilled the partial GET request for the resource.
   The request MUST have included a Range header field (section 14.35)
   indicating the desired range, and MAY have included an If-Range
   header field (section 14.27) to make the request conditional.

   The response MUST include the following header fields:

      - Either a Content-Range header field (section 14.16) indicating
        the range included with this response, or a multipart/byteranges
        Content-Type including Content-Range fields for each part. If a
        Content-Length header field is present in the response, its
        value MUST match the actual number of OCTETs transmitted in the
        message-body.

      - Date

      - ETag and/or Content-Location, if the header would have been sent
        in a 200 response to the same request




Fielding, et al.            Standards Track                    [Page 60]

RFC 2616                        HTTP/1.1                       June 1999


      - Expires, Cache-Control, and/or Vary, if the field-value might
        differ from that sent in any previous response for the same
        variant

   If the 206 response is the result of an If-Range request that used a
   strong cache validator (see section 13.3.3), the response SHOULD NOT
   include other entity-headers. If the response is the result of an
   If-Range request that used a weak validator, the response MUST NOT
   include other entity-headers; this prevents inconsistencies between
   cached entity-bodies and updated headers. Otherwise, the response
   MUST include all of the entity-headers that would have been returned
   with a 200 (OK) response to the same request.

   A cache MUST NOT combine a 206 response with other previously cached
   content if the ETag or Last-Modified headers do not match exactly,
   see 13.5.4.

   A cache that does not support the Range and Content-Range headers
   MUST NOT cache 206 (Partial) responses.

10.3 Redirection 3xx

   This class of status code indicates that further action needs to be
   taken by the user agent in order to fulfill the request.  The action
   required MAY be carried out by the user agent without interaction
   with the user if and only if the method used in the second request is
   GET or HEAD. A client SHOULD detect infinite redirection loops, since
   such loops generate network traffic for each redirection.

      Note: previous versions of this specification recommended a
      maximum of five redirections. Content developers should be aware
      that there might be clients that implement such a fixed
      limitation.

10.3.1 300 Multiple Choices

   The requested resource corresponds to any one of a set of
   representations, each with its own specific location, and agent-
   driven negotiation information (section 12) is being provided so that
   the user (or user agent) can select a preferred representation and
   redirect its request to that location.

   Unless it was a HEAD request, the response SHOULD include an entity
   containing a list of resource characteristics and location(s) from
   which the user or user agent can choose the one most appropriate. The
   entity format is specified by the media type given in the Content-
   Type header field. Depending upon the format and the capabilities of




Fielding, et al.            Standards Track                    [Page 61]

RFC 2616                        HTTP/1.1                       June 1999


   the user agent, selection of the most appropriate choice MAY be
   performed automatically. However, this specification does not define
   any standard for such automatic selection.

   If the server has a preferred choice of representation, it SHOULD
   include the specific URI for that representation in the Location
   field; user agents MAY use the Location field value for automatic
   redirection. This response is cacheable unless indicated otherwise.

10.3.2 301 Moved Permanently

   The requested resource has been assigned a new permanent URI and any
   future references to this resource SHOULD use one of the returned
   URIs.  Clients with link editing capabilities ought to automatically
   re-link references to the Request-URI to one or more of the new
   references returned by the server, where possible. This response is
   cacheable unless indicated otherwise.

   The new permanent URI SHOULD be given by the Location field in the
   response. Unless the request method was HEAD, the entity of the
   response SHOULD contain a short hypertext note with a hyperlink to
   the new URI(s).

   If the 301 status code is received in response to a request other
   than GET or HEAD, the user agent MUST NOT automatically redirect the
   request unless it can be confirmed by the user, since this might
   change the conditions under which the request was issued.

      Note: When automatically redirecting a POST request after
      receiving a 301 status code, some existing HTTP/1.0 user agents
      will erroneously change it into a GET request.

10.3.3 302 Found

   The requested resource resides temporarily under a different URI.
   Since the redirection might be altered on occasion, the client SHOULD
   continue to use the Request-URI for future requests.  This response
   is only cacheable if indicated by a Cache-Control or Expires header
   field.

   The temporary URI SHOULD be given by the Location field in the
   response. Unless the request method was HEAD, the entity of the
   response SHOULD contain a short hypertext note with a hyperlink to
   the new URI(s).







Fielding, et al.            Standards Track                    [Page 62]

RFC 2616                        HTTP/1.1                       June 1999


   If the 302 status code is received in response to a request other
   than GET or HEAD, the user agent MUST NOT automatically redirect the
   request unless it can be confirmed by the user, since this might
   change the conditions under which the request was issued.

      Note: RFC 1945 and RFC 2068 specify that the client is not allowed
      to change the method on the redirected request.  However, most
      existing user agent implementations treat 302 as if it were a 303
      response, performing a GET on the Location field-value regardless
      of the original request method. The status codes 303 and 307 have
      been added for servers that wish to make unambiguously clear which
      kind of reaction is expected of the client.

10.3.4 303 See Other

   The response to the request can be found under a different URI and
   SHOULD be retrieved using a GET method on that resource. This method
   exists primarily to allow the output of a POST-activated script to
   redirect the user agent to a selected resource. The new URI is not a
   substitute reference for the originally requested resource. The 303
   response MUST NOT be cached, but the response to the second
   (redirected) request might be cacheable.

   The different URI SHOULD be given by the Location field in the
   response. Unless the request method was HEAD, the entity of the
   response SHOULD contain a short hypertext note with a hyperlink to
   the new URI(s).

      Note: Many pre-HTTP/1.1 user agents do not understand the 303
      status. When interoperability with such clients is a concern, the
      302 status code may be used instead, since most user agents react
      to a 302 response as described here for 303.

10.3.5 304 Not Modified

   If the client has performed a conditional GET request and access is
   allowed, but the document has not been modified, the server SHOULD
   respond with this status code. The 304 response MUST NOT contain a
   message-body, and thus is always terminated by the first empty line
   after the header fields.

   The response MUST include the following header fields:

      - Date, unless its omission is required by section 14.18.1







Fielding, et al.            Standards Track                    [Page 63]

RFC 2616                        HTTP/1.1                       June 1999


   If a clockless origin server obeys these rules, and proxies and
   clients add their own Date to any response received without one (as
   already specified by [RFC 2068], section 14.19), caches will operate
   correctly.

      - ETag and/or Content-Location, if the header would have been sent
        in a 200 response to the same request

      - Expires, Cache-Control, and/or Vary, if the field-value might
        differ from that sent in any previous response for the same
        variant

   If the conditional GET used a strong cache validator (see section
   13.3.3), the response SHOULD NOT include other entity-headers.
   Otherwise (i.e., the conditional GET used a weak validator), the
   response MUST NOT include other entity-headers; this prevents
   inconsistencies between cached entity-bodies and updated headers.

   If a 304 response indicates an entity not currently cached, then the
   cache MUST disregard the response and repeat the request without the
   conditional.

   If a cache uses a received 304 response to update a cache entry, the
   cache MUST update the entry to reflect any new field values given in
   the response.

10.3.6 305 Use Proxy

   The requested resource MUST be accessed through the proxy given by
   the Location field. The Location field gives the URI of the proxy.
   The recipient is expected to repeat this single request via the
   proxy. 305 responses MUST only be generated by origin servers.

      Note: RFC 2068 was not clear that 305 was intended to redirect a
      single request, and to be generated by origin servers only.  Not
      observing these limitations has significant security consequences.

10.3.7 306 (Unused)

   The 306 status code was used in a previous version of the
   specification, is no longer used, and the code is reserved.










Fielding, et al.            Standards Track                    [Page 64]

RFC 2616                        HTTP/1.1                       June 1999


10.3.8 307 Temporary Redirect

   The requested resource resides temporarily under a different URI.
   Since the redirection MAY be altered on occasion, the client SHOULD
   continue to use the Request-URI for future requests.  This response
   is only cacheable if indicated by a Cache-Control or Expires header
   field.

   The temporary URI SHOULD be given by the Location field in the
   response. Unless the request method was HEAD, the entity of the
   response SHOULD contain a short hypertext note with a hyperlink to
   the new URI(s) , since many pre-HTTP/1.1 user agents do not
   understand the 307 status. Therefore, the note SHOULD contain the
   information necessary for a user to repeat the original request on
   the new URI.

   If the 307 status code is received in response to a request other
   than GET or HEAD, the user agent MUST NOT automatically redirect the
   request unless it can be confirmed by the user, since this might
   change the conditions under which the request was issued.

10.4 Client Error 4xx

   The 4xx class of status code is intended for cases in which the
   client seems to have erred. Except when responding to a HEAD request,
   the server SHOULD include an entity containing an explanation of the
   error situation, and whether it is a temporary or permanent
   condition. These status codes are applicable to any request method.
   User agents SHOULD display any included entity to the user.

   If the client is sending data, a server implementation using TCP
   SHOULD be careful to ensure that the client acknowledges receipt of
   the packet(s) containing the response, before the server closes the
   input connection. If the client continues sending data to the server
   after the close, the server's TCP stack will send a reset packet to
   the client, which may erase the client's unacknowledged input buffers
   before they can be read and interpreted by the HTTP application.

10.4.1 400 Bad Request

   The request could not be understood by the server due to malformed
   syntax. The client SHOULD NOT repeat the request without
   modifications.








Fielding, et al.            Standards Track                    [Page 65]

RFC 2616                        HTTP/1.1                       June 1999


10.4.2 401 Unauthorized

   The request requires user authentication. The response MUST include a
   WWW-Authenticate header field (section 14.47) containing a challenge
   applicable to the requested resource. The client MAY repeat the
   request with a suitable Authorization header field (section 14.8). If
   the request already included Authorization credentials, then the 401
   response indicates that authorization has been refused for those
   credentials. If the 401 response contains the same challenge as the
   prior response, and the user agent has already attempted
   authentication at least once, then the user SHOULD be presented the
   entity that was given in the response, since that entity might
   include relevant diagnostic information. HTTP access authentication
   is explained in "HTTP Authentication: Basic and Digest Access
   Authentication" [43].

10.4.3 402 Payment Required

   This code is reserved for future use.

10.4.4 403 Forbidden

   The server understood the request, but is refusing to fulfill it.
   Authorization will not help and the request SHOULD NOT be repeated.
   If the request method was not HEAD and the server wishes to make
   public why the request has not been fulfilled, it SHOULD describe the
   reason for the refusal in the entity.  If the server does not wish to
   make this information available to the client, the status code 404
   (Not Found) can be used instead.

10.4.5 404 Not Found

   The server has not found anything matching the Request-URI. No
   indication is given of whether the condition is temporary or
   permanent. The 410 (Gone) status code SHOULD be used if the server
   knows, through some internally configurable mechanism, that an old
   resource is permanently unavailable and has no forwarding address.
   This status code is commonly used when the server does not wish to
   reveal exactly why the request has been refused, or when no other
   response is applicable.

10.4.6 405 Method Not Allowed

   The method specified in the Request-Line is not allowed for the
   resource identified by the Request-URI. The response MUST include an
   Allow header containing a list of valid methods for the requested
   resource.




Fielding, et al.            Standards Track                    [Page 66]

RFC 2616                        HTTP/1.1                       June 1999


10.4.7 406 Not Acceptable

   The resource identified by the request is only capable of generating
   response entities which have content characteristics not acceptable
   according to the accept headers sent in the request.

   Unless it was a HEAD request, the response SHOULD include an entity
   containing a list of available entity characteristics and location(s)
   from which the user or user agent can choose the one most
   appropriate. The entity format is specified by the media type given
   in the Content-Type header field. Depending upon the format and the
   capabilities of the user agent, selection of the most appropriate
   choice MAY be performed automatically. However, this specification
   does not define any standard for such automatic selection.

      Note: HTTP/1.1 servers are allowed to return responses which are
      not acceptable according to the accept headers sent in the
      request. In some cases, this may even be preferable to sending a
      406 response. User agents are encouraged to inspect the headers of
      an incoming response to determine if it is acceptable.

   If the response could be unacceptable, a user agent SHOULD
   temporarily stop receipt of more data and query the user for a
   decision on further actions.

10.4.8 407 Proxy Authentication Required

   This code is similar to 401 (Unauthorized), but indicates that the
   client must first authenticate itself with the proxy. The proxy MUST
   return a Proxy-Authenticate header field (section 14.33) containing a
   challenge applicable to the proxy for the requested resource. The
   client MAY repeat the request with a suitable Proxy-Authorization
   header field (section 14.34). HTTP access authentication is explained
   in "HTTP Authentication: Basic and Digest Access Authentication"
   [43].

10.4.9 408 Request Timeout

   The client did not produce a request within the time that the server
   was prepared to wait. The client MAY repeat the request without
   modifications at any later time.

10.4.10 409 Conflict

   The request could not be completed due to a conflict with the current
   state of the resource. This code is only allowed in situations where
   it is expected that the user might be able to resolve the conflict
   and resubmit the request. The response body SHOULD include enough



Fielding, et al.            Standards Track                    [Page 67]

RFC 2616                        HTTP/1.1                       June 1999


   information for the user to recognize the source of the conflict.
   Ideally, the response entity would include enough information for the
   user or user agent to fix the problem; however, that might not be
   possible and is not required.

   Conflicts are most likely to occur in response to a PUT request. For
   example, if versioning were being used and the entity being PUT
   included changes to a resource which conflict with those made by an
   earlier (third-party) request, the server might use the 409 response
   to indicate that it can't complete the request. In this case, the
   response entity would likely contain a list of the differences
   between the two versions in a format defined by the response
   Content-Type.

10.4.11 410 Gone

   The requested resource is no longer available at the server and no
   forwarding address is known. This condition is expected to be
   considered permanent. Clients with link editing capabilities SHOULD
   delete references to the Request-URI after user approval. If the
   server does not know, or has no facility to determine, whether or not
   the condition is permanent, the status code 404 (Not Found) SHOULD be
   used instead. This response is cacheable unless indicated otherwise.

   The 410 response is primarily intended to assist the task of web
   maintenance by notifying the recipient that the resource is
   intentionally unavailable and that the server owners desire that
   remote links to that resource be removed. Such an event is common for
   limited-time, promotional services and for resources belonging to
   individuals no longer working at the server's site. It is not
   necessary to mark all permanently unavailable resources as "gone" or
   to keep the mark for any length of time -- that is left to the
   discretion of the server owner.

10.4.12 411 Length Required

   The server refuses to accept the request without a defined Content-
   Length. The client MAY repeat the request if it adds a valid
   Content-Length header field containing the length of the message-body
   in the request message.

10.4.13 412 Precondition Failed

   The precondition given in one or more of the request-header fields
   evaluated to false when it was tested on the server. This response
   code allows the client to place preconditions on the current resource
   metainformation (header field data) and thus prevent the requested
   method from being applied to a resource other than the one intended.



Fielding, et al.            Standards Track                    [Page 68]

RFC 2616                        HTTP/1.1                       June 1999


10.4.14 413 Request Entity Too Large

   The server is refusing to process a request because the request
   entity is larger than the server is willing or able to process. The
   server MAY close the connection to prevent the client from continuing
   the request.

   If the condition is temporary, the server SHOULD include a Retry-
   After header field to indicate that it is temporary and after what
   time the client MAY try again.

10.4.15 414 Request-URI Too Long

   The server is refusing to service the request because the Request-URI
   is longer than the server is willing to interpret. This rare
   condition is only likely to occur when a client has improperly
   converted a POST request to a GET request with long query
   information, when the client has descended into a URI "black hole" of
   redirection (e.g., a redirected URI prefix that points to a suffix of
   itself), or when the server is under attack by a client attempting to
   exploit security holes present in some servers using fixed-length
   buffers for reading or manipulating the Request-URI.

10.4.16 415 Unsupported Media Type

   The server is refusing to service the request because the entity of
   the request is in a format not supported by the requested resource
   for the requested method.

10.4.17 416 Requested Range Not Satisfiable

   A server SHOULD return a response with this status code if a request
   included a Range request-header field (section 14.35), and none of
   the range-specifier values in this field overlap the current extent
   of the selected resource, and the request did not include an If-Range
   request-header field. (For byte-ranges, this means that the first-
   byte-pos of all of the byte-range-spec values were greater than the
   current length of the selected resource.)

   When this status code is returned for a byte-range request, the
   response SHOULD include a Content-Range entity-header field
   specifying the current length of the selected resource (see section
   14.16). This response MUST NOT use the multipart/byteranges content-
   type.







Fielding, et al.            Standards Track                    [Page 69]

RFC 2616                        HTTP/1.1                       June 1999


10.4.18 417 Expectation Failed

   The expectation given in an Expect request-header field (see section
   14.20) could not be met by this server, or, if the server is a proxy,
   the server has unambiguous evidence that the request could not be met
   by the next-hop server.

10.5 Server Error 5xx

   Response status codes beginning with the digit "5" indicate cases in
   which the server is aware that it has erred or is incapable of
   performing the request. Except when responding to a HEAD request, the
   server SHOULD include an entity containing an explanation of the
   error situation, and whether it is a temporary or permanent
   condition. User agents SHOULD display any included entity to the
   user. These response codes are applicable to any request method.

10.5.1 500 Internal Server Error

   The server encountered an unexpected condition which prevented it
   from fulfilling the request.

10.5.2 501 Not Implemented

   The server does not support the functionality required to fulfill the
   request. This is the appropriate response when the server does not
   recognize the request method and is not capable of supporting it for
   any resource.

10.5.3 502 Bad Gateway

   The server, while acting as a gateway or proxy, received an invalid
   response from the upstream server it accessed in attempting to
   fulfill the request.

10.5.4 503 Service Unavailable

   The server is currently unable to handle the request due to a
   temporary overloading or maintenance of the server. The implication
   is that this is a temporary condition which will be alleviated after
   some delay. If known, the length of the delay MAY be indicated in a
   Retry-After header. If no Retry-After is given, the client SHOULD
   handle the response as it would for a 500 response.

      Note: The existence of the 503 status code does not imply that a
      server must use it when becoming overloaded. Some servers may wish
      to simply refuse the connection.




Fielding, et al.            Standards Track                    [Page 70]

RFC 2616                        HTTP/1.1                       June 1999


10.5.5 504 Gateway Timeout

   The server, while acting as a gateway or proxy, did not receive a
   timely response from the upstream server specified by the URI (e.g.
   HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed
   to access in attempting to complete the request.

      Note: Note to implementors: some deployed proxies are known to
      return 400 or 500 when DNS lookups time out.

10.5.6 505 HTTP Version Not Supported

   The server does not support, or refuses to support, the HTTP protocol
   version that was used in the request message. The server is
   indicating that it is unable or unwilling to complete the request
   using the same major version as the client, as described in section
   3.1, other than with this error message. The response SHOULD contain
   an entity describing why that version is not supported and what other
   protocols are supported by that server.

11 Access Authentication

   HTTP provides several OPTIONAL challenge-response authentication
   mechanisms which can be used by a server to challenge a client
   request and by a client to provide authentication information. The
   general framework for access authentication, and the specification of
   "basic" and "digest" authentication, are specified in "HTTP
   Authentication: Basic and Digest Access Authentication" [43]. This
   specification adopts the definitions of "challenge" and "credentials"
   from that specification.

12 Content Negotiation

   Most HTTP responses include an entity which contains information for
   interpretation by a human user. Naturally, it is desirable to supply
   the user with the "best available" entity corresponding to the
   request. Unfortunately for servers and caches, not all users have the
   same preferences for what is "best," and not all user agents are
   equally capable of rendering all entity types. For that reason, HTTP
   has provisions for several mechanisms for "content negotiation" --
   the process of selecting the best representation for a given response
   when there are multiple representations available.

      Note: This is not called "format negotiation" because the
      alternate representations may be of the same media type, but use
      different capabilities of that type, be in different languages,
      etc.




Fielding, et al.            Standards Track                    [Page 71]

RFC 2616                        HTTP/1.1                       June 1999


   Any response containing an entity-body MAY be subject to negotiation,
   including error responses.

   There are two kinds of content negotiation which are possible in
   HTTP: server-driven and agent-driven negotiation. These two kinds of
   negotiation are orthogonal and thus may be used separately or in
   combination. One method of combination, referred to as transparent
   negotiation, occurs when a cache uses the agent-driven negotiation
   information provided by the origin server in order to provide
   server-driven negotiation for subsequent requests.

12.1 Server-driven Negotiation

   If the selection of the best representation for a response is made by
   an algorithm located at the server, it is called server-driven
   negotiation. Selection is based on the available representations of
   the response (the dimensions over which it can vary; e.g. language,
   content-coding, etc.) and the contents of particular header fields in
   the request message or on other information pertaining to the request
   (such as the network address of the client).

   Server-driven negotiation is advantageous when the algorithm for
   selecting from among the available representations is difficult to
   describe to the user agent, or when the server desires to send its
   "best guess" to the client along with the first response (hoping to
   avoid the round-trip delay of a subsequent request if the "best
   guess" is good enough for the user). In order to improve the server's
   guess, the user agent MAY include request header fields (Accept,
   Accept-Language, Accept-Encoding, etc.) which describe its
   preferences for such a response.

   Server-driven negotiation has disadvantages:

      1. It is impossible for the server to accurately determine what
         might be "best" for any given user, since that would require
         complete knowledge of both the capabilities of the user agent
         and the intended use for the response (e.g., does the user want
         to view it on screen or print it on paper?).

      2. Having the user agent describe its capabilities in every
         request can be both very inefficient (given that only a small
         percentage of responses have multiple representations) and a
         potential violation of the user's privacy.

      3. It complicates the implementation of an origin server and the
         algorithms for generating responses to a request.





Fielding, et al.            Standards Track                    [Page 72]

RFC 2616                        HTTP/1.1                       June 1999


      4. It may limit a public cache's ability to use the same response
         for multiple user's requests.

   HTTP/1.1 includes the following request-header fields for enabling
   server-driven negotiation through description of user agent
   capabilities and user preferences: Accept (section 14.1), Accept-
   Charset (section 14.2), Accept-Encoding (section 14.3), Accept-
   Language (section 14.4), and User-Agent (section 14.43). However, an
   origin server is not limited to these dimensions and MAY vary the
   response based on any aspect of the request, including information
   outside the request-header fields or within extension header fields
   not defined by this specification.

   The Vary  header field can be used to express the parameters the
   server uses to select a representation that is subject to server-
   driven negotiation. See section 13.6 for use of the Vary header field
   by caches and section 14.44 for use of the Vary header field by
   servers.

12.2 Agent-driven Negotiation

   With agent-driven negotiation, selection of the best representation
   for a response is performed by the user agent after receiving an
   initial response from the origin server. Selection is based on a list
   of the available representations of the response included within the
   header fields or entity-body of the initial response, with each
   representation identified by its own URI. Selection from among the
   representations may be performed automatically (if the user agent is
   capable of doing so) or manually by the user selecting from a
   generated (possibly hypertext) menu.

   Agent-driven negotiation is advantageous when the response would vary
   over commonly-used dimensions (such as type, language, or encoding),
   when the origin server is unable to determine a user agent's
   capabilities from examining the request, and generally when public
   caches are used to distribute server load and reduce network usage.

   Agent-driven negotiation suffers from the disadvantage of needing a
   second request to obtain the best alternate representation. This
   second request is only efficient when caching is used. In addition,
   this specification does not define any mechanism for supporting
   automatic selection, though it also does not prevent any such
   mechanism from being developed as an extension and used within
   HTTP/1.1.







Fielding, et al.            Standards Track                    [Page 73]

RFC 2616                        HTTP/1.1                       June 1999


   HTTP/1.1 defines the 300 (Multiple Choices) and 406 (Not Acceptable)
   status codes for enabling agent-driven negotiation when the server is
   unwilling or unable to provide a varying response using server-driven
   negotiation.

12.3 Transparent Negotiation

   Transparent negotiation is a combination of both server-driven and
   agent-driven negotiation. When a cache is supplied with a form of the
   list of available representations of the response (as in agent-driven
   negotiation) and the dimensions of variance are completely understood
   by the cache, then the cache becomes capable of performing server-
   driven negotiation on behalf of the origin server for subsequent
   requests on that resource.

   Transparent negotiation has the advantage of distributing the
   negotiation work that would otherwise be required of the origin
   server and also removing the second request delay of agent-driven
   negotiation when the cache is able to correctly guess the right
   response.

   This specification does not define any mechanism for transparent
   negotiation, though it also does not prevent any such mechanism from
   being developed as an extension that could be used within HTTP/1.1.

13 Caching in HTTP

   HTTP is typically used for distributed information systems, where
   performance can be improved by the use of response caches. The
   HTTP/1.1 protocol includes a number of elements intended to make
   caching work as well as possible. Because these elements are
   inextricable from other aspects of the protocol, and because they
   interact with each other, it is useful to describe the basic caching
   design of HTTP separately from the detailed descriptions of methods,
   headers, response codes, etc.

   Caching would be useless if it did not significantly improve
   performance. The goal of caching in HTTP/1.1 is to eliminate the need
   to send requests in many cases, and to eliminate the need to send
   full responses in many other cases. The former reduces the number of
   network round-trips required for many operations; we use an
   "expiration" mechanism for this purpose (see section 13.2). The
   latter reduces network bandwidth requirements; we use a "validation"
   mechanism for this purpose (see section 13.3).

   Requirements for performance, availability, and disconnected
   operation require us to be able to relax the goal of semantic
   transparency. The HTTP/1.1 protocol allows origin servers, caches,



Fielding, et al.            Standards Track                    [Page 74]

RFC 2616                        HTTP/1.1                       June 1999


   and clients to explicitly reduce transparency when necessary.
   However, because non-transparent operation may confuse non-expert
   users, and might be incompatible with certain server applications
   (such as those for ordering merchandise), the protocol requires that
   transparency be relaxed

      - only by an explicit protocol-level request when relaxed by
        client or origin server

      - only with an explicit warning to the end user when relaxed by
        cache or client

   Therefore, the HTTP/1.1 protocol provides these important elements:

      1. Protocol features that provide full semantic transparency when
         this is required by all parties.

      2. Protocol features that allow an origin server or user agent to
         explicitly request and control non-transparent operation.

      3. Protocol features that allow a cache to attach warnings to
         responses that do not preserve the requested approximation of
         semantic transparency.

   A basic principle is that it must be possible for the clients to
   detect any potential relaxation of semantic transparency.

      Note: The server, cache, or client implementor might be faced with
      design decisions not explicitly discussed in this specification.
      If a decision might affect semantic transparency, the implementor
      ought to err on the side of maintaining transparency unless a
      careful and complete analysis shows significant benefits in
      breaking transparency.

13.1.1 Cache Correctness

   A correct cache MUST respond to a request with the most up-to-date
   response held by the cache that is appropriate to the request (see
   sections 13.2.5, 13.2.6, and 13.12) which meets one of the following
   conditions:

      1. It has been checked for equivalence with what the origin server
         would have returned by revalidating the response with the
         origin server (section 13.3);







Fielding, et al.            Standards Track                    [Page 75]

RFC 2616                        HTTP/1.1                       June 1999


      2. It is "fresh enough" (see section 13.2). In the default case,
         this means it meets the least restrictive freshness requirement
         of the client, origin server, and cache (see section 14.9); if
         the origin server so specifies, it is the freshness requirement
         of the origin server alone.

         If a stored response is not "fresh enough" by the most
         restrictive freshness requirement of both the client and the
         origin server, in carefully considered circumstances the cache
         MAY still return the response with the appropriate Warning
         header (see section 13.1.5 and 14.46), unless such a response
         is prohibited (e.g., by a "no-store" cache-directive, or by a
         "no-cache" cache-request-directive; see section 14.9).

      3. It is an appropriate 304 (Not Modified), 305 (Proxy Redirect),
         or error (4xx or 5xx) response message.

   If the cache can not communicate with the origin server, then a
   correct cache SHOULD respond as above if the response can be
   correctly served from the cache; if not it MUST return an error or
   warning indicating that there was a communication failure.

   If a cache receives a response (either an entire response, or a 304
   (Not Modified) response) that it would normally forward to the
   requesting client, and the received response is no longer fresh, the
   cache SHOULD forward it to the requesting client without adding a new
   Warning (but without removing any existing Warning headers). A cache
   SHOULD NOT attempt to revalidate a response simply because that
   response became stale in transit; this might lead to an infinite
   loop. A user agent that receives a stale response without a Warning
   MAY display a warning indication to the user.

13.1.2 Warnings

   Whenever a cache returns a response that is neither first-hand nor
   "fresh enough" (in the sense of condition 2 in section 13.1.1), it
   MUST attach a warning to that effect, using a Warning general-header.
   The Warning header and the currently defined warnings are described
   in section 14.46. The warning allows clients to take appropriate
   action.

   Warnings MAY be used for other purposes, both cache-related and
   otherwise. The use of a warning, rather than an error status code,
   distinguish these responses from true failures.

   Warnings are assigned three digit warn-codes. The first digit
   indicates whether the Warning MUST or MUST NOT be deleted from a
   stored cache entry after a successful revalidation:



Fielding, et al.            Standards Track                    [Page 76]

RFC 2616                        HTTP/1.1                       June 1999


   1xx  Warnings that describe the freshness or revalidation status of
     the response, and so MUST be deleted after a successful
     revalidation. 1XX warn-codes MAY be generated by a cache only when
     validating a cached entry. It MUST NOT be generated by clients.

   2xx  Warnings that describe some aspect of the entity body or entity
     headers that is not rectified by a revalidation (for example, a
     lossy compression of the entity bodies) and which MUST NOT be
     deleted after a successful revalidation.

   See section 14.46 for the definitions of the codes themselves.

   HTTP/1.0 caches will cache all Warnings in responses, without
   deleting the ones in the first category. Warnings in responses that
   are passed to HTTP/1.0 caches carry an extra warning-date field,
   which prevents a future HTTP/1.1 recipient from believing an
   erroneously cached Warning.

   Warnings also carry a warning text. The text MAY be in any
   appropriate natural language (perhaps based on the client's Accept
   headers), and include an OPTIONAL indication of what character set is
   used.

   Multiple warnings MAY be attached to a response (either by the origin
   server or by a cache), including multiple warnings with the same code
   number. For example, a server might provide the same warning with
   texts in both English and Basque.

   When multiple warnings are attached to a response, it might not be
   practical or reasonable to display all of them to the user. This
   version of HTTP does not specify strict priority rules for deciding
   which warnings to display and in what order, but does suggest some
   heuristics.

13.1.3 Cache-control Mechanisms

   The basic cache mechanisms in HTTP/1.1 (server-specified expiration
   times and validators) are implicit directives to caches. In some
   cases, a server or client might need to provide explicit directives
   to the HTTP caches. We use the Cache-Control header for this purpose.

   The Cache-Control header allows a client or server to transmit a
   variety of directives in either requests or responses. These
   directives typically override the default caching algorithms. As a
   general rule, if there is any apparent conflict between header
   values, the most restrictive interpretation is applied (that is, the
   one that is most likely to preserve semantic transparency). However,




Fielding, et al.            Standards Track                    [Page 77]

RFC 2616                        HTTP/1.1                       June 1999


   in some cases, cache-control directives are explicitly specified as
   weakening the approximation of semantic transparency (for example,
   "max-stale" or "public").

   The cache-control directives are described in detail in section 14.9.

13.1.4 Explicit User Agent Warnings

   Many user agents make it possible for users to override the basic
   caching mechanisms. For example, the user agent might allow the user
   to specify that cached entities (even explicitly stale ones) are
   never validated. Or the user agent might habitually add "Cache-
   Control: max-stale=3600" to every request. The user agent SHOULD NOT
   default to either non-transparent behavior, or behavior that results
   in abnormally ineffective caching, but MAY be explicitly configured
   to do so by an explicit action of the user.

   If the user has overridden the basic caching mechanisms, the user
   agent SHOULD explicitly indicate to the user whenever this results in
   the display of information that might not meet the server's
   transparency requirements (in particular, if the displayed entity is
   known to be stale). Since the protocol normally allows the user agent
   to determine if responses are stale or not, this indication need only
   be displayed when this actually happens. The indication need not be a
   dialog box; it could be an icon (for example, a picture of a rotting
   fish) or some other indicator.

   If the user has overridden the caching mechanisms in a way that would
   abnormally reduce the effectiveness of caches, the user agent SHOULD
   continually indicate this state to the user (for example, by a
   display of a picture of currency in flames) so that the user does not
   inadvertently consume excess resources or suffer from excessive
   latency.

13.1.5 Exceptions to the Rules and Warnings

   In some cases, the operator of a cache MAY choose to configure it to
   return stale responses even when not requested by clients. This
   decision ought not be made lightly, but may be necessary for reasons
   of availability or performance, especially when the cache is poorly
   connected to the origin server. Whenever a cache returns a stale
   response, it MUST mark it as such (using a Warning header) enabling
   the client software to alert the user that there might be a potential
   problem.







Fielding, et al.            Standards Track                    [Page 78]

RFC 2616                        HTTP/1.1                       June 1999


   It also allows the user agent to take steps to obtain a first-hand or
   fresh response. For this reason, a cache SHOULD NOT return a stale
   response if the client explicitly requests a first-hand or fresh one,
   unless it is impossible to comply for technical or policy reasons.

13.1.6 Client-controlled Behavior

   While the origin server (and to a lesser extent, intermediate caches,
   by their contribution to the age of a response) are the primary
   source of expiration information, in some cases the client might need
   to control a cache's decision about whether to return a cached
   response without validating it. Clients do this using several
   directives of the Cache-Control header.

   A client's request MAY specify the maximum age it is willing to
   accept of an unvalidated response; specifying a value of zero forces
   the cache(s) to revalidate all responses. A client MAY also specify
   the minimum time remaining before a response expires. Both of these
   options increase constraints on the behavior of caches, and so cannot
   further relax the cache's approximation of semantic transparency.

   A client MAY also specify that it will accept stale responses, up to
   some maximum amount of staleness. This loosens the constraints on the
   caches, and so might violate the origin server's specified
   constraints on semantic transparency, but might be necessary to
   support disconnected operation, or high availability in the face of
   poor connectivity.

13.2 Expiration Model

13.2.1 Server-Specified Expiration

   HTTP caching works best when caches can entirely avoid making
   requests to the origin server. The primary mechanism for avoiding
   requests is for an origin server to provide an explicit expiration
   time in the future, indicating that a response MAY be used to satisfy
   subsequent requests. In other words, a cache can return a fresh
   response without first contacting the server.

   Our expectation is that servers will assign future explicit
   expiration times to responses in the belief that the entity is not
   likely to change, in a semantically significant way, before the
   expiration time is reached. This normally preserves semantic
   transparency, as long as the server's expiration times are carefully
   chosen.






Fielding, et al.            Standards Track                    [Page 79]

RFC 2616                        HTTP/1.1                       June 1999


   The expiration mechanism applies only to responses taken from a cache
   and not to first-hand responses forwarded immediately to the
   requesting client.

   If an origin server wishes to force a semantically transparent cache
   to validate every request, it MAY assign an explicit expiration time
   in the past. This means that the response is always stale, and so the
   cache SHOULD validate it before using it for subsequent requests. See
   section 14.9.4 for a more restrictive way to force revalidation.

   If an origin server wishes to force any HTTP/1.1 cache, no matter how
   it is configured, to validate every request, it SHOULD use the "must-
   revalidate" cache-control directive (see section 14.9).

   Servers specify explicit expiration times using either the Expires
   header, or the max-age directive of the Cache-Control header.

   An expiration time cannot be used to force a user agent to refresh
   its display or reload a resource; its semantics apply only to caching
   mechanisms, and such mechanisms need only check a resource's
   expiration status when a new request for that resource is initiated.
   See section 13.13 for an explanation of the difference between caches
   and history mechanisms.

13.2.2 Heuristic Expiration

   Since origin servers do not always provide explicit expiration times,
   HTTP caches typically assign heuristic expiration times, employing
   algorithms that use other header values (such as the Last-Modified
   time) to estimate a plausible expiration time. The HTTP/1.1
   specification does not provide specific algorithms, but does impose
   worst-case constraints on their results. Since heuristic expiration
   times might compromise semantic transparency, they ought to used
   cautiously, and we encourage origin servers to provide explicit
   expiration times as much as possible.

13.2.3 Age Calculations

   In order to know if a cached entry is fresh, a cache needs to know if
   its age exceeds its freshness lifetime. We discuss how to calculate
   the latter in section 13.2.4; this section describes how to calculate
   the age of a response or cache entry.

   In this discussion, we use the term "now" to mean "the current value
   of the clock at the host performing the calculation." Hosts that use
   HTTP, but especially hosts running origin servers and caches, SHOULD
   use NTP [28] or some similar protocol to synchronize their clocks to
   a globally accurate time standard.



Fielding, et al.            Standards Track                    [Page 80]

RFC 2616                        HTTP/1.1                       June 1999


   HTTP/1.1 requires origin servers to send a Date header, if possible,
   with every response, giving the time at which the response was
   generated (see section 14.18). We use the term "date_value" to denote
   the value of the Date header, in a form appropriate for arithmetic
   operations.

   HTTP/1.1 uses the Age response-header to convey the estimated age of
   the response message when obtained from a cache. The Age field value
   is the cache's estimate of the amount of time since the response was
   generated or revalidated by the origin server.

   In essence, the Age value is the sum of the time that the response
   has been resident in each of the caches along the path from the
   origin server, plus the amount of time it has been in transit along
   network paths.

   We use the term "age_value" to denote the value of the Age header, in
   a form appropriate for arithmetic operations.

   A response's age can be calculated in two entirely independent ways:

      1. now minus date_value, if the local clock is reasonably well
         synchronized to the origin server's clock. If the result is
         negative, the result is replaced by zero.

      2. age_value, if all of the caches along the response path
         implement HTTP/1.1.

   Given that we have two independent ways to compute the age of a
   response when it is received, we can combine these as

       corrected_received_age = max(now - date_value, age_value)

   and as long as we have either nearly synchronized clocks or all-
   HTTP/1.1 paths, one gets a reliable (conservative) result.

   Because of network-imposed delays, some significant interval might
   pass between the time that a server generates a response and the time
   it is received at the next outbound cache or client. If uncorrected,
   this delay could result in improperly low ages.

   Because the request that resulted in the returned Age value must have
   been initiated prior to that Age value's generation, we can correct
   for delays imposed by the network by recording the time at which the
   request was initiated. Then, when an Age value is received, it MUST
   be interpreted relative to the time the request was initiated, not





Fielding, et al.            Standards Track                    [Page 81]

RFC 2616                        HTTP/1.1                       June 1999


   the time that the response was received. This algorithm results in
   conservative behavior no matter how much delay is experienced. So, we
   compute:

      corrected_initial_age = corrected_received_age
                            + (now - request_time)

   where "request_time" is the time (according to the local clock) when
   the request that elicited this response was sent.

   Summary of age calculation algorithm, when a cache receives a
   response:

      /*
       * age_value
       *      is the value of Age: header received by the cache with
       *              this response.
       * date_value
       *      is the value of the origin server's Date: header
       * request_time
       *      is the (local) time when the cache made the request
       *              that resulted in this cached response
       * response_time
       *      is the (local) time when the cache received the
       *              response
       * now
       *      is the current (local) time
       */

      apparent_age = max(0, response_time - date_value);
      corrected_received_age = max(apparent_age, age_value);
      response_delay = response_time - request_time;
      corrected_initial_age = corrected_received_age + response_delay;
      resident_time = now - response_time;
      current_age   = corrected_initial_age + resident_time;

   The current_age of a cache entry is calculated by adding the amount
   of time (in seconds) since the cache entry was last validated by the
   origin server to the corrected_initial_age. When a response is
   generated from a cache entry, the cache MUST include a single Age
   header field in the response with a value equal to the cache entry's
   current_age.

   The presence of an Age header field in a response implies that a
   response is not first-hand. However, the converse is not true, since
   the lack of an Age header field in a response does not imply that the





Fielding, et al.            Standards Track                    [Page 82]

RFC 2616                        HTTP/1.1                       June 1999


   response is first-hand unless all caches along the request path are
   compliant with HTTP/1.1 (i.e., older HTTP caches did not implement
   the Age header field).

13.2.4 Expiration Calculations

   In order to decide whether a response is fresh or stale, we need to
   compare its freshness lifetime to its age. The age is calculated as
   described in section 13.2.3; this section describes how to calculate
   the freshness lifetime, and to determine if a response has expired.
   In the discussion below, the values can be represented in any form
   appropriate for arithmetic operations.

   We use the term "expires_value" to denote the value of the Expires
   header. We use the term "max_age_value" to denote an appropriate
   value of the number of seconds carried by the "max-age" directive of
   the Cache-Control header in a response (see section 14.9.3).

   The max-age directive takes priority over Expires, so if max-age is
   present in a response, the calculation is simply:

      freshness_lifetime = max_age_value

   Otherwise, if Expires is present in the response, the calculation is:

      freshness_lifetime = expires_value - date_value

   Note that neither of these calculations is vulnerable to clock skew,
   since all of the information comes from the origin server.

   If none of Expires, Cache-Control: max-age, or Cache-Control: s-
   maxage (see section 14.9.3) appears in the response, and the response
   does not include other restrictions on caching, the cache MAY compute
   a freshness lifetime using a heuristic. The cache MUST attach Warning
   113 to any response whose age is more than 24 hours if such warning
   has not already been added.

   Also, if the response does have a Last-Modified time, the heuristic
   expiration value SHOULD be no more than some fraction of the interval
   since that time. A typical setting of this fraction might be 10%.

   The calculation to determine if a response has expired is quite
   simple:

      response_is_fresh = (freshness_lifetime > current_age)






Fielding, et al.            Standards Track                    [Page 83]

RFC 2616                        HTTP/1.1                       June 1999


13.2.5 Disambiguating Expiration Values

   Because expiration values are assigned optimistically, it is possible
   for two caches to contain fresh values for the same resource that are
   different.

   If a client performing a retrieval receives a non-first-hand response
   for a request that was already fresh in its own cache, and the Date
   header in its existing cache entry is newer than the Date on the new
   response, then the client MAY ignore the response. If so, it MAY
   retry the request with a "Cache-Control: max-age=0" directive (see
   section 14.9), to force a check with the origin server.

   If a cache has two fresh responses for the same representation with
   different validators, it MUST use the one with the more recent Date
   header. This situation might arise because the cache is pooling
   responses from other caches, or because a client has asked for a
   reload or a revalidation of an apparently fresh cache entry.

13.2.6 Disambiguating Multiple Responses

   Because a client might be receiving responses via multiple paths, so
   that some responses flow through one set of caches and other
   responses flow through a different set of caches, a client might
   receive responses in an order different from that in which the origin
   server sent them. We would like the client to use the most recently
   generated response, even if older responses are still apparently
   fresh.

   Neither the entity tag nor the expiration value can impose an
   ordering on responses, since it is possible that a later response
   intentionally carries an earlier expiration time. The Date values are
   ordered to a granularity of one second.

   When a client tries to revalidate a cache entry, and the response it
   receives contains a Date header that appears to be older than the one
   for the existing entry, then the client SHOULD repeat the request
   unconditionally, and include

       Cache-Control: max-age=0

   to force any intermediate caches to validate their copies directly
   with the origin server, or

       Cache-Control: no-cache

   to force any intermediate caches to obtain a new copy from the origin
   server.



Fielding, et al.            Standards Track                    [Page 84]

RFC 2616                        HTTP/1.1                       June 1999


   If the Date values are equal, then the client MAY use either response
   (or MAY, if it is being extremely prudent, request a new response).
   Servers MUST NOT depend on clients being able to choose
   deterministically between responses generated during the same second,
   if their expiration times overlap.

13.3 Validation Model

   When a cache has a stale entry that it would like to use as a
   response to a client's request, it first has to check with the origin
   server (or possibly an intermediate cache with a fresh response) to
   see if its cached entry is still usable. We call this "validating"
   the cache entry. Since we do not want to have to pay the overhead of
   retransmitting the full response if the cached entry is good, and we
   do not want to pay the overhead of an extra round trip if the cached
   entry is invalid, the HTTP/1.1 protocol supports the use of
   conditional methods.

   The key protocol features for supporting conditional methods are
   those concerned with "cache validators." When an origin server
   generates a full response, it attaches some sort of validator to it,
   which is kept with the cache entry. When a client (user agent or
   proxy cache) makes a conditional request for a resource for which it
   has a cache entry, it includes the associated validator in the
   request.

   The server then checks that validator against the current validator
   for the entity, and, if they match (see section 13.3.3), it responds
   with a special status code (usually, 304 (Not Modified)) and no
   entity-body. Otherwise, it returns a full response (including
   entity-body). Thus, we avoid transmitting the full response if the
   validator matches, and we avoid an extra round trip if it does not
   match.

   In HTTP/1.1, a conditional request looks exactly the same as a normal
   request for the same resource, except that it carries a special
   header (which includes the validator) that implicitly turns the
   method (usually, GET) into a conditional.

   The protocol includes both positive and negative senses of cache-
   validating conditions. That is, it is possible to request either that
   a method be performed if and only if a validator matches or if and
   only if no validators match.








Fielding, et al.            Standards Track                    [Page 85]

RFC 2616                        HTTP/1.1                       June 1999


      Note: a response that lacks a validator may still be cached, and
      served from cache until it expires, unless this is explicitly
      prohibited by a cache-control directive. However, a cache cannot
      do a conditional retrieval if it does not have a validator for the
      entity, which means it will not be refreshable after it expires.

13.3.1 Last-Modified Dates

   The Last-Modified entity-header field value is often used as a cache
   validator. In simple terms, a cache entry is considered to be valid
   if the entity has not been modified since the Last-Modified value.

13.3.2 Entity Tag Cache Validators

   The ETag response-header field value, an entity tag, provides for an
   "opaque" cache validator. This might allow more reliable validation
   in situations where it is inconvenient to store modification dates,
   where the one-second resolution of HTTP date values is not
   sufficient, or where the origin server wishes to avoid certain
   paradoxes that might arise from the use of modification dates.

   Entity Tags are described in section 3.11. The headers used with
   entity tags are described in sections 14.19, 14.24, 14.26 and 14.44.

13.3.3 Weak and Strong Validators

   Since both origin servers and caches will compare two validators to
   decide if they represent the same or different entities, one normally
   would expect that if the entity (the entity-body or any entity-
   headers) changes in any way, then the associated validator would
   change as well. If this is true, then we call this validator a
   "strong validator."

   However, there might be cases when a server prefers to change the
   validator only on semantically significant changes, and not when
   insignificant aspects of the entity change. A validator that does not
   always change when the resource changes is a "weak validator."

   Entity tags are normally "strong validators," but the protocol
   provides a mechanism to tag an entity tag as "weak." One can think of
   a strong validator as one that changes whenever the bits of an entity
   changes, while a weak value changes whenever the meaning of an entity
   changes. Alternatively, one can think of a strong validator as part
   of an identifier for a specific entity, while a weak validator is
   part of an identifier for a set of semantically equivalent entities.

      Note: One example of a strong validator is an integer that is
      incremented in stable storage every time an entity is changed.



Fielding, et al.            Standards Track                    [Page 86]

RFC 2616                        HTTP/1.1                       June 1999


      An entity's modification time, if represented with one-second
      resolution, could be a weak validator, since it is possible that
      the resource might be modified twice during a single second.

      Support for weak validators is optional. However, weak validators
      allow for more efficient caching of equivalent objects; for
      example, a hit counter on a site is probably good enough if it is
      updated every few days or weeks, and any value during that period
      is likely "good enough" to be equivalent.

   A "use" of a validator is either when a client generates a request
   and includes the validator in a validating header field, or when a
   server compares two validators.

   Strong validators are usable in any context. Weak validators are only
   usable in contexts that do not depend on exact equality of an entity.
   For example, either kind is usable for a conditional GET of a full
   entity. However, only a strong validator is usable for a sub-range
   retrieval, since otherwise the client might end up with an internally
   inconsistent entity.

   Clients MAY issue simple (non-subrange) GET requests with either weak
   validators or strong validators. Clients MUST NOT use weak validators
   in other forms of request.

   The only function that the HTTP/1.1 protocol defines on validators is
   comparison. There are two validator comparison functions, depending
   on whether the comparison context allows the use of weak validators
   or not:

      - The strong comparison function: in order to be considered equal,
        both validators MUST be identical in every way, and both MUST
        NOT be weak.

      - The weak comparison function: in order to be considered equal,
        both validators MUST be identical in every way, but either or
        both of them MAY be tagged as "weak" without affecting the
        result.

   An entity tag is strong unless it is explicitly tagged as weak.
   Section 3.11 gives the syntax for entity tags.

   A Last-Modified time, when used as a validator in a request, is
   implicitly weak unless it is possible to deduce that it is strong,
   using the following rules:

      - The validator is being compared by an origin server to the
        actual current validator for the entity and,



Fielding, et al.            Standards Track                    [Page 87]

RFC 2616                        HTTP/1.1                       June 1999


      - That origin server reliably knows that the associated entity did
        not change twice during the second covered by the presented
        validator.

   or

      - The validator is about to be used by a client in an If-
        Modified-Since or If-Unmodified-Since header, because the client
        has a cache entry for the associated entity, and

      - That cache entry includes a Date value, which gives the time
        when the origin server sent the original response, and

      - The presented Last-Modified time is at least 60 seconds before
        the Date value.

   or

      - The validator is being compared by an intermediate cache to the
        validator stored in its cache entry for the entity, and

      - That cache entry includes a Date value, which gives the time
        when the origin server sent the original response, and

      - The presented Last-Modified time is at least 60 seconds before
        the Date value.

   This method relies on the fact that if two different responses were
   sent by the origin server during the same second, but both had the
   same Last-Modified time, then at least one of those responses would
   have a Date value equal to its Last-Modified time. The arbitrary 60-
   second limit guards against the possibility that the Date and Last-
   Modified values are generated from different clocks, or at somewhat
   different times during the preparation of the response. An
   implementation MAY use a value larger than 60 seconds, if it is
   believed that 60 seconds is too short.

   If a client wishes to perform a sub-range retrieval on a value for
   which it has only a Last-Modified time and no opaque validator, it
   MAY do this only if the Last-Modified time is strong in the sense
   described here.

   A cache or origin server receiving a conditional request, other than
   a full-body GET request, MUST use the strong comparison function to
   evaluate the condition.

   These rules allow HTTP/1.1 caches and clients to safely perform sub-
   range retrievals on values that have been obtained from HTTP/1.0



Fielding, et al.            Standards Track                    [Page 88]

RFC 2616                        HTTP/1.1                       June 1999


   servers.

13.3.4 Rules for When to Use Entity Tags and Last-Modified Dates

   We adopt a set of rules and recommendations for origin servers,
   clients, and caches regarding when various validator types ought to
   be used, and for what purposes.

   HTTP/1.1 origin servers:

      - SHOULD send an entity tag validator unless it is not feasible to
        generate one.

      - MAY send a weak entity tag instead of a strong entity tag, if
        performance considerations support the use of weak entity tags,
        or if it is unfeasible to send a strong entity tag.

      - SHOULD send a Last-Modified value if it is feasible to send one,
        unless the risk of a breakdown in semantic transparency that
        could result from using this date in an If-Modified-Since header
        would lead to serious problems.

   In other words, the preferred behavior for an HTTP/1.1 origin server
   is to send both a strong entity tag and a Last-Modified value.

   In order to be legal, a strong entity tag MUST change whenever the
   associated entity value changes in any way. A weak entity tag SHOULD
   change whenever the associated entity changes in a semantically
   significant way.

      Note: in order to provide semantically transparent caching, an
      origin server must avoid reusing a specific strong entity tag
      value for two different entities, or reusing a specific weak
      entity tag value for two semantically different entities. Cache
      entries might persist for arbitrarily long periods, regardless of
      expiration times, so it might be inappropriate to expect that a
      cache will never again attempt to validate an entry using a
      validator that it obtained at some point in the past.

   HTTP/1.1 clients:

      - If an entity tag has been provided by the origin server, MUST
        use that entity tag in any cache-conditional request (using If-
        Match or If-None-Match).

      - If only a Last-Modified value has been provided by the origin
        server, SHOULD use that value in non-subrange cache-conditional
        requests (using If-Modified-Since).



Fielding, et al.            Standards Track                    [Page 89]

RFC 2616                        HTTP/1.1                       June 1999


      - If only a Last-Modified value has been provided by an HTTP/1.0
        origin server, MAY use that value in subrange cache-conditional
        requests (using If-Unmodified-Since:). The user agent SHOULD
        provide a way to disable this, in case of difficulty.

      - If both an entity tag and a Last-Modified value have been
        provided by the origin server, SHOULD use both validators in
        cache-conditional requests. This allows both HTTP/1.0 and
        HTTP/1.1 caches to respond appropriately.

   An HTTP/1.1 origin server, upon receiving a conditional request that
   includes both a Last-Modified date (e.g., in an If-Modified-Since or
   If-Unmodified-Since header field) and one or more entity tags (e.g.,
   in an If-Match, If-None-Match, or If-Range header field) as cache
   validators, MUST NOT return a response status of 304 (Not Modified)
   unless doing so is consistent with all of the conditional header
   fields in the request.

   An HTTP/1.1 caching proxy, upon receiving a conditional request that
   includes both a Last-Modified date and one or more entity tags as
   cache validators, MUST NOT return a locally cached response to the
   client unless that cached response is consistent with all of the
   conditional header fields in the request.

      Note: The general principle behind these rules is that HTTP/1.1
      servers and clients should transmit as much non-redundant
      information as is available in their responses and requests.
      HTTP/1.1 systems receiving this information will make the most
      conservative assumptions about the validators they receive.

      HTTP/1.0 clients and caches will ignore entity tags. Generally,
      last-modified values received or used by these systems will
      support transparent and efficient caching, and so HTTP/1.1 origin
      servers should provide Last-Modified values. In those rare cases
      where the use of a Last-Modified value as a validator by an
      HTTP/1.0 system could result in a serious problem, then HTTP/1.1
      origin servers should not provide one.

13.3.5 Non-validating Conditionals

   The principle behind entity tags is that only the service author
   knows the semantics of a resource well enough to select an
   appropriate cache validation mechanism, and the specification of any
   validator comparison function more complex than byte-equality would
   open up a can of worms. Thus, comparisons of any other headers
   (except Last-Modified, for compatibility with HTTP/1.0) are never
   used for purposes of validating a cache entry.




Fielding, et al.            Standards Track                    [Page 90]

RFC 2616                        HTTP/1.1                       June 1999


13.4 Response Cacheability

   Unless specifically constrained by a cache-control (section 14.9)
   directive, a caching system MAY always store a successful response
   (see section 13.8) as a cache entry, MAY return it without validation
   if it is fresh, and MAY return it after successful validation. If
   there is neither a cache validator nor an explicit expiration time
   associated with a response, we do not expect it to be cached, but
   certain caches MAY violate this expectation (for example, when little
   or no network connectivity is available). A client can usually detect
   that such a response was taken from a cache by comparing the Date
   header to the current time.

      Note: some HTTP/1.0 caches are known to violate this expectation
      without providing any Warning.

   However, in some cases it might be inappropriate for a cache to
   retain an entity, or to return it in response to a subsequent
   request. This might be because absolute semantic transparency is
   deemed necessary by the service author, or because of security or
   privacy considerations. Certain cache-control directives are
   therefore provided so that the server can indicate that certain
   resource entities, or portions thereof, are not to be cached
   regardless of other considerations.

   Note that section 14.8 normally prevents a shared cache from saving
   and returning a response to a previous request if that request
   included an Authorization header.

   A response received with a status code of 200, 203, 206, 300, 301 or
   410 MAY be stored by a cache and used in reply to a subsequent
   request, subject to the expiration mechanism, unless a cache-control
   directive prohibits caching. However, a cache that does not support
   the Range and Content-Range headers MUST NOT cache 206 (Partial
   Content) responses.

   A response received with any other status code (e.g. status codes 302
   and 307) MUST NOT be returned in a reply to a subsequent request
   unless there are cache-control directives or another header(s) that
   explicitly allow it. For example, these include the following: an
   Expires header (section 14.21); a "max-age", "s-maxage",  "must-
   revalidate", "proxy-revalidate", "public" or "private" cache-control
   directive (section 14.9).








Fielding, et al.            Standards Track                    [Page 91]

RFC 2616                        HTTP/1.1                       June 1999


13.5 Constructing Responses From Caches

   The purpose of an HTTP cache is to store information received in
   response to requests for use in responding to future requests. In
   many cases, a cache simply returns the appropriate parts of a
   response to the requester. However, if the cache holds a cache entry
   based on a previous response, it might have to combine parts of a new
   response with what is held in the cache entry.

13.5.1 End-to-end and Hop-by-hop Headers

   For the purpose of defining the behavior of caches and non-caching
   proxies, we divide HTTP headers into two categories:

      - End-to-end headers, which are  transmitted to the ultimate
        recipient of a request or response. End-to-end headers in
        responses MUST be stored as part of a cache entry and MUST be
        transmitted in any response formed from a cache entry.

      - Hop-by-hop headers, which are meaningful only for a single
        transport-level connection, and are not stored by caches or
        forwarded by proxies.

   The following HTTP/1.1 headers are hop-by-hop headers:

      - Connection
      - Keep-Alive
      - Proxy-Authenticate
      - Proxy-Authorization
      - TE
      - Trailers
      - Transfer-Encoding
      - Upgrade

   All other headers defined by HTTP/1.1 are end-to-end headers.

   Other hop-by-hop headers MUST be listed in a Connection header,
   (section 14.10) to be introduced into HTTP/1.1 (or later).

13.5.2 Non-modifiable Headers

   Some features of the HTTP/1.1 protocol, such as Digest
   Authentication, depend on the value of certain end-to-end headers. A
   transparent proxy SHOULD NOT modify an end-to-end header unless the
   definition of that header requires or specifically allows that.






Fielding, et al.            Standards Track                    [Page 92]

RFC 2616                        HTTP/1.1                       June 1999


   A transparent proxy MUST NOT modify any of the following fields in a
   request or response, and it MUST NOT add any of these fields if not
   already present:

      - Content-Location

      - Content-MD5

      - ETag

      - Last-Modified

   A transparent proxy MUST NOT modify any of the following fields in a
   response:

      - Expires

   but it MAY add any of these fields if not already present. If an
   Expires header is added, it MUST be given a field-value identical to
   that of the Date header in that response.

   A  proxy MUST NOT modify or add any of the following fields in a
   message that contains the no-transform cache-control directive, or in
   any request:

      - Content-Encoding

      - Content-Range

      - Content-Type

   A non-transparent proxy MAY modify or add these fields to a message
   that does not include no-transform, but if it does so, it MUST add a
   Warning 214 (Transformation applied) if one does not already appear
   in the message (see section 14.46).

      Warning: unnecessary modification of end-to-end headers might
      cause authentication failures if stronger authentication
      mechanisms are introduced in later versions of HTTP. Such
      authentication mechanisms MAY rely on the values of header fields
      not listed here.

   The Content-Length field of a request or response is added or deleted
   according to the rules in section 4.4. A transparent proxy MUST
   preserve the entity-length (section 7.2.2) of the entity-body,
   although it MAY change the transfer-length (section 4.4).





Fielding, et al.            Standards Track                    [Page 93]

RFC 2616                        HTTP/1.1                       June 1999


13.5.3 Combining Headers

   When a cache makes a validating request to a server, and the server
   provides a 304 (Not Modified) response or a 206 (Partial Content)
   response, the cache then constructs a response to send to the
   requesting client.

   If the status code is 304 (Not Modified), the cache uses the entity-
   body stored in the cache entry as the entity-body of this outgoing
   response. If the status code is 206 (Partial Content) and the ETag or
   Last-Modified headers match exactly, the cache MAY combine the
   contents stored in the cache entry with the new contents received in
   the response and use the result as the entity-body of this outgoing
   response, (see 13.5.4).

   The end-to-end headers stored in the cache entry are used for the
   constructed response, except that

      - any stored Warning headers with warn-code 1xx (see section
        14.46) MUST be deleted from the cache entry and the forwarded
        response.

      - any stored Warning headers with warn-code 2xx MUST be retained
        in the cache entry and the forwarded response.

      - any end-to-end headers provided in the 304 or 206 response MUST
        replace the corresponding headers from the cache entry.

   Unless the cache decides to remove the cache entry, it MUST also
   replace the end-to-end headers stored with the cache entry with
   corresponding headers received in the incoming response, except for
   Warning headers as described immediately above. If a header field-
   name in the incoming response matches more than one header in the
   cache entry, all such old headers MUST be replaced.

   In other words, the set of end-to-end headers received in the
   incoming response overrides all corresponding end-to-end headers
   stored with the cache entry (except for stored Warning headers with
   warn-code 1xx, which are deleted even if not overridden).

      Note: this rule allows an origin server to use a 304 (Not
      Modified) or a 206 (Partial Content) response to update any header
      associated with a previous response for the same entity or sub-
      ranges thereof, although it might not always be meaningful or
      correct to do so. This rule does not allow an origin server to use
      a 304 (Not Modified) or a 206 (Partial Content) response to
      entirely delete a header that it had provided with a previous
      response.



Fielding, et al.            Standards Track                    [Page 94]

RFC 2616                        HTTP/1.1                       June 1999


13.5.4 Combining Byte Ranges

   A response might transfer only a subrange of the bytes of an entity-
   body, either because the request included one or more Range
   specifications, or because a connection was broken prematurely. After
   several such transfers, a cache might have received several ranges of
   the same entity-body.

   If a cache has a stored non-empty set of subranges for an entity, and
   an incoming response transfers another subrange, the cache MAY
   combine the new subrange with the existing set if both the following
   conditions are met:

      - Both the incoming response and the cache entry have a cache
        validator.

      - The two cache validators match using the strong comparison
        function (see section 13.3.3).

   If either requirement is not met, the cache MUST use only the most
   recent partial response (based on the Date values transmitted with
   every response, and using the incoming response if these values are
   equal or missing), and MUST discard the other partial information.

13.6 Caching Negotiated Responses

   Use of server-driven content negotiation (section 12.1), as indicated
   by the presence of a Vary header field in a response, alters the
   conditions and procedure by which a cache can use the response for
   subsequent requests. See section 14.44 for use of the Vary header
   field by servers.

   A server SHOULD use the Vary header field to inform a cache of what
   request-header fields were used to select among multiple
   representations of a cacheable response subject to server-driven
   negotiation. The set of header fields named by the Vary field value
   is known as the "selecting" request-headers.

   When the cache receives a subsequent request whose Request-URI
   specifies one or more cache entries including a Vary header field,
   the cache MUST NOT use such a cache entry to construct a response to
   the new request unless all of the selecting request-headers present
   in the new request match the corresponding stored request-headers in
   the original request.

   The selecting request-headers from two requests are defined to match
   if and only if the selecting request-headers in the first request can
   be transformed to the selecting request-headers in the second request



Fielding, et al.            Standards Track                    [Page 95]

RFC 2616                        HTTP/1.1                       June 1999


   by adding or removing linear white space (LWS) at places where this
   is allowed by the corresponding BNF, and/or combining multiple
   message-header fields with the same field name following the rules
   about message headers in section 4.2.

   A Vary header field-value of "*" always fails to match and subsequent
   requests on that resource can only be properly interpreted by the
   origin server.

   If the selecting request header fields for the cached entry do not
   match the selecting request header fields of the new request, then
   the cache MUST NOT use a cached entry to satisfy the request unless
   it first relays the new request to the origin server in a conditional
   request and the server responds with 304 (Not Modified), including an
   entity tag or Content-Location that indicates the entity to be used.

   If an entity tag was assigned to a cached representation, the
   forwarded request SHOULD be conditional and include the entity tags
   in an If-None-Match header field from all its cache entries for the
   resource. This conveys to the server the set of entities currently
   held by the cache, so that if any one of these entities matches the
   requested entity, the server can use the ETag header field in its 304
   (Not Modified) response to tell the cache which entry is appropriate.
   If the entity-tag of the new response matches that of an existing
   entry, the new response SHOULD be used to update the header fields of
   the existing entry, and the result MUST be returned to the client.

   If any of the existing cache entries contains only partial content
   for the associated entity, its entity-tag SHOULD NOT be included in
   the If-None-Match header field unless the request is for a range that
   would be fully satisfied by that entry.

   If a cache receives a successful response whose Content-Location
   field matches that of an existing cache entry for the same Request-
   ]URI, whose entity-tag differs from that of the existing entry, and
   whose Date is more recent than that of the existing entry, the
   existing entry SHOULD NOT be returned in response to future requests
   and SHOULD be deleted from the cache.

13.7 Shared and Non-Shared Caches

   For reasons of security and privacy, it is necessary to make a
   distinction between "shared" and "non-shared" caches. A non-shared
   cache is one that is accessible only to a single user. Accessibility
   in this case SHOULD be enforced by appropriate security mechanisms.
   All other caches are considered to be "shared." Other sections of





Fielding, et al.            Standards Track                    [Page 96]

RFC 2616                        HTTP/1.1                       June 1999


   this specification place certain constraints on the operation of
   shared caches in order to prevent loss of privacy or failure of
   access controls.

13.8 Errors or Incomplete Response Cache Behavior

   A cache that receives an incomplete response (for example, with fewer
   bytes of data than specified in a Content-Length header) MAY store
   the response. However, the cache MUST treat this as a partial
   response. Partial responses MAY be combined as described in section
   13.5.4; the result might be a full response or might still be
   partial. A cache MUST NOT return a partial response to a client
   without explicitly marking it as such, using the 206 (Partial
   Content) status code. A cache MUST NOT return a partial response
   using a status code of 200 (OK).

   If a cache receives a 5xx response while attempting to revalidate an
   entry, it MAY either forward this response to the requesting client,
   or act as if the server failed to respond. In the latter case, it MAY
   return a previously received response unless the cached entry
   includes the "must-revalidate" cache-control directive (see section
   14.9).

13.9 Side Effects of GET and HEAD

   Unless the origin server explicitly prohibits the caching of their
   responses, the application of GET and HEAD methods to any resources
   SHOULD NOT have side effects that would lead to erroneous behavior if
   these responses are taken from a cache. They MAY still have side
   effects, but a cache is not required to consider such side effects in
   its caching decisions. Caches are always expected to observe an
   origin server's explicit restrictions on caching.

   We note one exception to this rule: since some applications have
   traditionally used GETs and HEADs with query URLs (those containing a
   "?" in the rel_path part) to perform operations with significant side
   effects, caches MUST NOT treat responses to such URIs as fresh unless
   the server provides an explicit expiration time. This specifically
   means that responses from HTTP/1.0 servers for such URIs SHOULD NOT
   be taken from a cache. See section 9.1.1 for related information.

13.10 Invalidation After Updates or Deletions

   The effect of certain methods performed on a resource at the origin
   server might cause one or more existing cache entries to become non-
   transparently invalid. That is, although they might continue to be
   "fresh," they do not accurately reflect what the origin server would
   return for a new request on that resource.



Fielding, et al.            Standards Track                    [Page 97]

RFC 2616                        HTTP/1.1                       June 1999


   There is no way for the HTTP protocol to guarantee that all such
   cache entries are marked invalid. For example, the request that
   caused the change at the origin server might not have gone through
   the proxy where a cache entry is stored. However, several rules help
   reduce the likelihood of erroneous behavior.

   In this section, the phrase "invalidate an entity" means that the
   cache will either remove all instances of that entity from its
   storage, or will mark these as "invalid" and in need of a mandatory
   revalidation before they can be returned in response to a subsequent
   request.

   Some HTTP methods MUST cause a cache to invalidate an entity. This is
   either the entity referred to by the Request-URI, or by the Location
   or Content-Location headers (if present). These methods are:

      - PUT

      - DELETE

      - POST

   In order to prevent denial of service attacks, an invalidation based
   on the URI in a Location or Content-Location header MUST only be
   performed if the host part is the same as in the Request-URI.

   A cache that passes through requests for methods it does not
   understand SHOULD invalidate any entities referred to by the
   Request-URI.

13.11 Write-Through Mandatory

   All methods that might be expected to cause modifications to the
   origin server's resources MUST be written through to the origin
   server. This currently includes all methods except for GET and HEAD.
   A cache MUST NOT reply to such a request from a client before having
   transmitted the request to the inbound server, and having received a
   corresponding response from the inbound server. This does not prevent
   a proxy cache from sending a 100 (Continue) response before the
   inbound server has sent its final reply.

   The alternative (known as "write-back" or "copy-back" caching) is not
   allowed in HTTP/1.1, due to the difficulty of providing consistent
   updates and the problems arising from server, cache, or network
   failure prior to write-back.






Fielding, et al.            Standards Track                    [Page 98]

RFC 2616                        HTTP/1.1                       June 1999


13.12 Cache Replacement

   If a new cacheable (see sections 14.9.2, 13.2.5, 13.2.6 and 13.8)
   response is received from a resource while any existing responses for
   the same resource are cached, the cache SHOULD use the new response
   to reply to the current request. It MAY insert it into cache storage
   and MAY, if it meets all other requirements, use it to respond to any
   future requests that would previously have caused the old response to
   be returned. If it inserts the new response into cache storage  the
   rules in section 13.5.3 apply.

      Note: a new response that has an older Date header value than
      existing cached responses is not cacheable.

13.13 History Lists

   User agents often have history mechanisms, such as "Back" buttons and
   history lists, which can be used to redisplay an entity retrieved
   earlier in a session.

   History mechanisms and caches are different. In particular history
   mechanisms SHOULD NOT try to show a semantically transparent view of
   the current state of a resource. Rather, a history mechanism is meant
   to show exactly what the user saw at the time when the resource was
   retrieved.

   By default, an expiration time does not apply to history mechanisms.
   If the entity is still in storage, a history mechanism SHOULD display
   it even if the entity has expired, unless the user has specifically
   configured the agent to refresh expired history documents.

   This is not to be construed to prohibit the history mechanism from
   telling the user that a view might be stale.

      Note: if history list mechanisms unnecessarily prevent users from
      viewing stale resources, this will tend to force service authors
      to avoid using HTTP expiration controls and cache controls when
      they would otherwise like to. Service authors may consider it
      important that users not be presented with error messages or
      warning messages when they use navigation controls (such as BACK)
      to view previously fetched resources. Even though sometimes such
      resources ought not to cached, or ought to expire quickly, user
      interface considerations may force service authors to resort to
      other means of preventing caching (e.g. "once-only" URLs) in order
      not to suffer the effects of improperly functioning history
      mechanisms.





Fielding, et al.            Standards Track                    [Page 99]

RFC 2616                        HTTP/1.1                       June 1999


14 Header Field Definitions

   This section defines the syntax and semantics of all standard
   HTTP/1.1 header fields. For entity-header fields, both sender and
   recipient refer to either the client or the server, depending on who
   sends and who receives the entity.

14.1 Accept

   The Accept request-header field can be used to specify certain media
   types which are acceptable for the response. Accept headers can be
   used to indicate that the request is specifically limited to a small
   set of desired types, as in the case of a request for an in-line
   image.

       Accept         = "Accept" ":"
                        #( media-range [ accept-params ] )

       media-range    = ( "*/*"
                        | ( type "/" "*" )
                        | ( type "/" subtype )
                        ) *( ";" parameter )
       accept-params  = ";" "q" "=" qvalue *( accept-extension )
       accept-extension = ";" token [ "=" ( token | quoted-string ) ]

   The asterisk "*" character is used to group media types into ranges,
   with "*/*" indicating all media types and "type/*" indicating all
   subtypes of that type. The media-range MAY include media type
   parameters that are applicable to that range.

   Each media-range MAY be followed by one or more accept-params,
   beginning with the "q" parameter for indicating a relative quality
   factor. The first "q" parameter (if any) separates the media-range
   parameter(s) from the accept-params. Quality factors allow the user
   or user agent to indicate the relative degree of preference for that
   media-range, using the qvalue scale from 0 to 1 (section 3.9). The
   default value is q=1.

      Note: Use of the "q" parameter name to separate media type
      parameters from Accept extension parameters is due to historical
      practice. Although this prevents any media type parameter named
      "q" from being used with a media range, such an event is believed
      to be unlikely given the lack of any "q" parameters in the IANA
      media type registry and the rare usage of any media type
      parameters in Accept. Future media types are discouraged from
      registering any parameter named "q".





Fielding, et al.            Standards Track                   [Page 100]

RFC 2616                        HTTP/1.1                       June 1999


   The example

       Accept: audio/*; q=0.2, audio/basic

   SHOULD be interpreted as "I prefer audio/basic, but send me any audio
   type if it is the best available after an 80% mark-down in quality."

   If no Accept header field is present, then it is assumed that the
   client accepts all media types. If an Accept header field is present,
   and if the server cannot send a response which is acceptable
   according to the combined Accept field value, then the server SHOULD
   send a 406 (not acceptable) response.

   A more elaborate example is

       Accept: text/plain; q=0.5, text/html,
               text/x-dvi; q=0.8, text/x-c

   Verbally, this would be interpreted as "text/html and text/x-c are
   the preferred media types, but if they do not exist, then send the
   text/x-dvi entity, and if that does not exist, send the text/plain
   entity."

   Media ranges can be overridden by more specific media ranges or
   specific media types. If more than one media range applies to a given
   type, the most specific reference has precedence. For example,

       Accept: text/*, text/html, text/html;level=1, */*

   have the following precedence:

       1) text/html;level=1
       2) text/html
       3) text/*
       4) */*

   The media type quality factor associated with a given type is
   determined by finding the media range with the highest precedence
   which matches that type. For example,

       Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,
               text/html;level=2;q=0.4, */*;q=0.5

   would cause the following values to be associated:

       text/html;level=1         = 1
       text/html                 = 0.7
       text/plain                = 0.3



Fielding, et al.            Standards Track                   [Page 101]

RFC 2616                        HTTP/1.1                       June 1999


       image/jpeg                = 0.5
       text/html;level=2         = 0.4
       text/html;level=3         = 0.7

      Note: A user agent might be provided with a default set of quality
      values for certain media ranges. However, unless the user agent is
      a closed system which cannot interact with other rendering agents,
      this default set ought to be configurable by the user.

14.2 Accept-Charset

   The Accept-Charset request-header field can be used to indicate what
   character sets are acceptable for the response. This field allows
   clients capable of understanding more comprehensive or special-
   purpose character sets to signal that capability to a server which is
   capable of representing documents in those character sets.

      Accept-Charset = "Accept-Charset" ":"
              1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )


   Character set values are described in section 3.4. Each charset MAY
   be given an associated quality value which represents the user's
   preference for that charset. The default value is q=1. An example is

      Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

   The special value "*", if present in the Accept-Charset field,
   matches every character set (including ISO-8859-1) which is not
   mentioned elsewhere in the Accept-Charset field. If no "*" is present
   in an Accept-Charset field, then all character sets not explicitly
   mentioned get a quality value of 0, except for ISO-8859-1, which gets
   a quality value of 1 if not explicitly mentioned.

   If no Accept-Charset header is present, the default is that any
   character set is acceptable. If an Accept-Charset header is present,
   and if the server cannot send a response which is acceptable
   according to the Accept-Charset header, then the server SHOULD send
   an error response with the 406 (not acceptable) status code, though
   the sending of an unacceptable response is also allowed.

14.3 Accept-Encoding

   The Accept-Encoding request-header field is similar to Accept, but
   restricts the content-codings (section 3.5) that are acceptable in
   the response.

       Accept-Encoding  = "Accept-Encoding" ":"



Fielding, et al.            Standards Track                   [Page 102]

RFC 2616                        HTTP/1.1                       June 1999


                          1#( codings [ ";" "q" "=" qvalue ] )
       codings          = ( content-coding | "*" )

   Examples of its use are:

       Accept-Encoding: compress, gzip
       Accept-Encoding:
       Accept-Encoding: *
       Accept-Encoding: compress;q=0.5, gzip;q=1.0
       Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

   A server tests whether a content-coding is acceptable, according to
   an Accept-Encoding field, using these rules:

      1. If the content-coding is one of the content-codings listed in
         the Accept-Encoding field, then it is acceptable, unless it is
         accompanied by a qvalue of 0. (As defined in section 3.9, a
         qvalue of 0 means "not acceptable.")

      2. The special "*" symbol in an Accept-Encoding field matches any
         available content-coding not explicitly listed in the header
         field.

      3. If multiple content-codings are acceptable, then the acceptable
         content-coding with the highest non-zero qvalue is preferred.

      4. The "identity" content-coding is always acceptable, unless
         specifically refused because the Accept-Encoding field includes
         "identity;q=0", or because the field includes "*;q=0" and does
         not explicitly include the "identity" content-coding. If the
         Accept-Encoding field-value is empty, then only the "identity"
         encoding is acceptable.

   If an Accept-Encoding field is present in a request, and if the
   server cannot send a response which is acceptable according to the
   Accept-Encoding header, then the server SHOULD send an error response
   with the 406 (Not Acceptable) status code.

   If no Accept-Encoding field is present in a request, the server MAY
   assume that the client will accept any content coding. In this case,
   if "identity" is one of the available content-codings, then the
   server SHOULD use the "identity" content-coding, unless it has
   additional information that a different content-coding is meaningful
   to the client.

      Note: If the request does not include an Accept-Encoding field,
      and if the "identity" content-coding is unavailable, then
      content-codings commonly understood by HTTP/1.0 clients (i.e.,



Fielding, et al.            Standards Track                   [Page 103]

RFC 2616                        HTTP/1.1                       June 1999


      "gzip" and "compress") are preferred; some older clients
      improperly display messages sent with other content-codings.  The
      server might also make this decision based on information about
      the particular user-agent or client.

      Note: Most HTTP/1.0 applications do not recognize or obey qvalues
      associated with content-codings. This means that qvalues will not
      work and are not permitted with x-gzip or x-compress.

14.4 Accept-Language

   The Accept-Language request-header field is similar to Accept, but
   restricts the set of natural languages that are preferred as a
   response to the request. Language tags are defined in section 3.10.

       Accept-Language = "Accept-Language" ":"
                         1#( language-range [ ";" "q" "=" qvalue ] )
       language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

   Each language-range MAY be given an associated quality value which
   represents an estimate of the user's preference for the languages
   specified by that range. The quality value defaults to "q=1". For
   example,

       Accept-Language: da, en-gb;q=0.8, en;q=0.7

   would mean: "I prefer Danish, but will accept British English and
   other types of English." A language-range matches a language-tag if
   it exactly equals the tag, or if it exactly equals a prefix of the
   tag such that the first tag character following the prefix is "-".
   The special range "*", if present in the Accept-Language field,
   matches every tag not matched by any other range present in the
   Accept-Language field.

      Note: This use of a prefix matching rule does not imply that
      language tags are assigned to languages in such a way that it is
      always true that if a user understands a language with a certain
      tag, then this user will also understand all languages with tags
      for which this tag is a prefix. The prefix rule simply allows the
      use of prefix tags if this is the case.

   The language quality factor assigned to a language-tag by the
   Accept-Language field is the quality value of the longest language-
   range in the field that matches the language-tag. If no language-
   range in the field matches the tag, the language quality factor
   assigned is 0. If no Accept-Language header is present in the
   request, the server




Fielding, et al.            Standards Track                   [Page 104]

RFC 2616                        HTTP/1.1                       June 1999


   SHOULD assume that all languages are equally acceptable. If an
   Accept-Language header is present, then all languages which are
   assigned a quality factor greater than 0 are acceptable.

   It might be contrary to the privacy expectations of the user to send
   an Accept-Language header with the complete linguistic preferences of
   the user in every request. For a discussion of this issue, see
   section 15.1.4.

   As intelligibility is highly dependent on the individual user, it is
   recommended that client applications make the choice of linguistic
   preference available to the user. If the choice is not made
   available, then the Accept-Language header field MUST NOT be given in
   the request.

      Note: When making the choice of linguistic preference available to
      the user, we remind implementors of  the fact that users are not
      familiar with the details of language matching as described above,
      and should provide appropriate guidance. As an example, users
      might assume that on selecting "en-gb", they will be served any
      kind of English document if British English is not available. A
      user agent might suggest in such a case to add "en" to get the
      best matching behavior.

14.5 Accept-Ranges

      The Accept-Ranges response-header field allows the server to
      indicate its acceptance of range requests for a resource:

          Accept-Ranges     = "Accept-Ranges" ":" acceptable-ranges
          acceptable-ranges = 1#range-unit | "none"

      Origin servers that accept byte-range requests MAY send

          Accept-Ranges: bytes

      but are not required to do so. Clients MAY generate byte-range
      requests without having received this header for the resource
      involved. Range units are defined in section 3.12.

      Servers that do not accept any kind of range request for a
      resource MAY send

          Accept-Ranges: none

      to advise the client not to attempt a range request.





Fielding, et al.            Standards Track                   [Page 105]

RFC 2616                        HTTP/1.1                       June 1999


14.6 Age

      The Age response-header field conveys the sender's estimate of the
      amount of time since the response (or its revalidation) was
      generated at the origin server. A cached response is "fresh" if
      its age does not exceed its freshness lifetime. Age values are
      calculated as specified in section 13.2.3.

           Age = "Age" ":" age-value
           age-value = delta-seconds

      Age values are non-negative decimal integers, representing time in
      seconds.

      If a cache receives a value larger than the largest positive
      integer it can represent, or if any of its age calculations
      overflows, it MUST transmit an Age header with a value of
      2147483648 (2^31). An HTTP/1.1 server that includes a cache MUST
      include an Age header field in every response generated from its
      own cache. Caches SHOULD use an arithmetic type of at least 31
      bits of range.

14.7 Allow

      The Allow entity-header field lists the set of methods supported
      by the resource identified by the Request-URI. The purpose of this
      field is strictly to inform the recipient of valid methods
      associated with the resource. An Allow header field MUST be
      present in a 405 (Method Not Allowed) response.

          Allow   = "Allow" ":" #Method

      Example of use:

          Allow: GET, HEAD, PUT

      This field cannot prevent a client from trying other methods.
      However, the indications given by the Allow header field value
      SHOULD be followed. The actual set of allowed methods is defined
      by the origin server at the time of each request.

      The Allow header field MAY be provided with a PUT request to
      recommend the methods to be supported by the new or modified
      resource. The server is not required to support these methods and
      SHOULD include an Allow header in the response giving the actual
      supported methods.





Fielding, et al.            Standards Track                   [Page 106]

RFC 2616                        HTTP/1.1                       June 1999


      A proxy MUST NOT modify the Allow header field even if it does not
      understand all the methods specified, since the user agent might
      have other means of communicating with the origin server.

14.8 Authorization

      A user agent that wishes to authenticate itself with a server--
      usually, but not necessarily, after receiving a 401 response--does
      so by including an Authorization request-header field with the
      request.  The Authorization field value consists of credentials
      containing the authentication information of the user agent for
      the realm of the resource being requested.

          Authorization  = "Authorization" ":" credentials

      HTTP access authentication is described in "HTTP Authentication:
      Basic and Digest Access Authentication" [43]. If a request is
      authenticated and a realm specified, the same credentials SHOULD
      be valid for all other requests within this realm (assuming that
      the authentication scheme itself does not require otherwise, such
      as credentials that vary according to a challenge value or using
      synchronized clocks).

      When a shared cache (see section 13.7) receives a request
      containing an Authorization field, it MUST NOT return the
      corresponding response as a reply to any other request, unless one
      of the following specific exceptions holds:

      1. If the response includes the "s-maxage" cache-control
         directive, the cache MAY use that response in replying to a
         subsequent request. But (if the specified maximum age has
         passed) a proxy cache MUST first revalidate it with the origin
         server, using the request-headers from the new request to allow
         the origin server to authenticate the new request. (This is the
         defined behavior for s-maxage.) If the response includes "s-
         maxage=0", the proxy MUST always revalidate it before re-using
         it.

      2. If the response includes the "must-revalidate" cache-control
         directive, the cache MAY use that response in replying to a
         subsequent request. But if the response is stale, all caches
         MUST first revalidate it with the origin server, using the
         request-headers from the new request to allow the origin server
         to authenticate the new request.

      3. If the response includes the "public" cache-control directive,
         it MAY be returned in reply to any subsequent request.




Fielding, et al.            Standards Track                   [Page 107]

RFC 2616                        HTTP/1.1                       June 1999


14.9 Cache-Control

   The Cache-Control general-header field is used to specify directives
   that MUST be obeyed by all caching mechanisms along the
   request/response chain. The directives specify behavior intended to
   prevent caches from adversely interfering with the request or
   response. These directives typically override the default caching
   algorithms. Cache directives are unidirectional in that the presence
   of a directive in a request does not imply that the same directive is
   to be given in the response.

      Note that HTTP/1.0 caches might not implement Cache-Control and
      might only implement Pragma: no-cache (see section 14.32).

   Cache directives MUST be passed through by a proxy or gateway
   application, regardless of their significance to that application,
   since the directives might be applicable to all recipients along the
   request/response chain. It is not possible to specify a cache-
   directive for a specific cache.

    Cache-Control   = "Cache-Control" ":" 1#cache-directive

    cache-directive = cache-request-directive
         | cache-response-directive

    cache-request-directive =
           "no-cache"                          ; Section 14.9.1
         | "no-store"                          ; Section 14.9.2
         | "max-age" "=" delta-seconds         ; Section 14.9.3, 14.9.4
         | "max-stale" [ "=" delta-seconds ]   ; Section 14.9.3
         | "min-fresh" "=" delta-seconds       ; Section 14.9.3
         | "no-transform"                      ; Section 14.9.5
         | "only-if-cached"                    ; Section 14.9.4
         | cache-extension                     ; Section 14.9.6

     cache-response-directive =
           "public"                               ; Section 14.9.1
         | "private" [ "=" <"> 1#field-name <"> ] ; Section 14.9.1
         | "no-cache" [ "=" <"> 1#field-name <"> ]; Section 14.9.1
         | "no-store"                             ; Section 14.9.2
         | "no-transform"                         ; Section 14.9.5
         | "must-revalidate"                      ; Section 14.9.4
         | "proxy-revalidate"                     ; Section 14.9.4
         | "max-age" "=" delta-seconds            ; Section 14.9.3
         | "s-maxage" "=" delta-seconds           ; Section 14.9.3
         | cache-extension                        ; Section 14.9.6

    cache-extension = token [ "=" ( token | quoted-string ) ]



Fielding, et al.            Standards Track                   [Page 108]

RFC 2616                        HTTP/1.1                       June 1999


   When a directive appears without any 1#field-name parameter, the
   directive applies to the entire request or response. When such a
   directive appears with a 1#field-name parameter, it applies only to
   the named field or fields, and not to the rest of the request or
   response. This mechanism supports extensibility; implementations of
   future versions of the HTTP protocol might apply these directives to
   header fields not defined in HTTP/1.1.

   The cache-control directives can be broken down into these general
   categories:

      - Restrictions on what are cacheable; these may only be imposed by
        the origin server.

      - Restrictions on what may be stored by a cache; these may be
        imposed by either the origin server or the user agent.

      - Modifications of the basic expiration mechanism; these may be
        imposed by either the origin server or the user agent.

      - Controls over cache revalidation and reload; these may only be
        imposed by a user agent.

      - Control over transformation of entities.

      - Extensions to the caching system.

14.9.1 What is Cacheable

   By default, a response is cacheable if the requirements of the
   request method, request header fields, and the response status
   indicate that it is cacheable. Section 13.4 summarizes these defaults
   for cacheability. The following Cache-Control response directives
   allow an origin server to override the default cacheability of a
   response:

   public
      Indicates that the response MAY be cached by any cache, even if it
      would normally be non-cacheable or cacheable only within a non-
      shared cache. (See also Authorization, section 14.8, for
      additional details.)

   private
      Indicates that all or part of the response message is intended for
      a single user and MUST NOT be cached by a shared cache. This
      allows an origin server to state that the specified parts of the





Fielding, et al.            Standards Track                   [Page 109]

RFC 2616                        HTTP/1.1                       June 1999


      response are intended for only one user and are not a valid
      response for requests by other users. A private (non-shared) cache
      MAY cache the response.

       Note: This usage of the word private only controls where the
       response may be cached, and cannot ensure the privacy of the
       message content.

   no-cache
       If the no-cache directive does not specify a field-name, then a
      cache MUST NOT use the response to satisfy a subsequent request
      without successful revalidation with the origin server. This
      allows an origin server to prevent caching even by caches that
      have been configured to return stale responses to client requests.

      If the no-cache directive does specify one or more field-names,
      then a cache MAY use the response to satisfy a subsequent request,
      subject to any other restrictions on caching. However, the
      specified field-name(s) MUST NOT be sent in the response to a
      subsequent request without successful revalidation with the origin
      server. This allows an origin server to prevent the re-use of
      certain header fields in a response, while still allowing caching
      of the rest of the response.

       Note: Most HTTP/1.0 caches will not recognize or obey this
       directive.

14.9.2 What May be Stored by Caches

   no-store
      The purpose of the no-store directive is to prevent the
      inadvertent release or retention of sensitive information (for
      example, on backup tapes). The no-store directive applies to the
      entire message, and MAY be sent either in a response or in a
      request. If sent in a request, a cache MUST NOT store any part of
      either this request or any response to it. If sent in a response,
      a cache MUST NOT store any part of either this response or the
      request that elicited it. This directive applies to both non-
      shared and shared caches. "MUST NOT store" in this context means
      that the cache MUST NOT intentionally store the information in
      non-volatile storage, and MUST make a best-effort attempt to
      remove the information from volatile storage as promptly as
      possible after forwarding it.

      Even when this directive is associated with a response, users
      might explicitly store such a response outside of the caching
      system (e.g., with a "Save As" dialog). History buffers MAY store
      such responses as part of their normal operation.



Fielding, et al.            Standards Track                   [Page 110]

RFC 2616                        HTTP/1.1                       June 1999


      The purpose of this directive is to meet the stated requirements
      of certain users and service authors who are concerned about
      accidental releases of information via unanticipated accesses to
      cache data structures. While the use of this directive might
      improve privacy in some cases, we caution that it is NOT in any
      way a reliable or sufficient mechanism for ensuring privacy. In
      particular, malicious or compromised caches might not recognize or
      obey this directive, and communications networks might be
      vulnerable to eavesdropping.

14.9.3 Modifications of the Basic Expiration Mechanism

   The expiration time of an entity MAY be specified by the origin
   server using the Expires header (see section 14.21). Alternatively,
   it MAY be specified using the max-age directive in a response. When
   the max-age cache-control directive is present in a cached response,
   the response is stale if its current age is greater than the age
   value given (in seconds) at the time of a new request for that
   resource. The max-age directive on a response implies that the
   response is cacheable (i.e., "public") unless some other, more
   restrictive cache directive is also present.

   If a response includes both an Expires header and a max-age
   directive, the max-age directive overrides the Expires header, even
   if the Expires header is more restrictive. This rule allows an origin
   server to provide, for a given response, a longer expiration time to
   an HTTP/1.1 (or later) cache than to an HTTP/1.0 cache. This might be
   useful if certain HTTP/1.0 caches improperly calculate ages or
   expiration times, perhaps due to desynchronized clocks.

   Many HTTP/1.0 cache implementations will treat an Expires value that
   is less than or equal to the response Date value as being equivalent
   to the Cache-Control response directive "no-cache". If an HTTP/1.1
   cache receives such a response, and the response does not include a
   Cache-Control header field, it SHOULD consider the response to be
   non-cacheable in order to retain compatibility with HTTP/1.0 servers.

       Note: An origin server might wish to use a relatively new HTTP
       cache control feature, such as the "private" directive, on a
       network including older caches that do not understand that
       feature. The origin server will need to combine the new feature
       with an Expires field whose value is less than or equal to the
       Date value. This will prevent older caches from improperly
       caching the response.







Fielding, et al.            Standards Track                   [Page 111]

RFC 2616                        HTTP/1.1                       June 1999


   s-maxage
       If a response includes an s-maxage directive, then for a shared
       cache (but not for a private cache), the maximum age specified by
       this directive overrides the maximum age specified by either the
       max-age directive or the Expires header. The s-maxage directive
       also implies the semantics of the proxy-revalidate directive (see
       section 14.9.4), i.e., that the shared cache must not use the
       entry after it becomes stale to respond to a subsequent request
       without first revalidating it with the origin server. The s-
       maxage directive is always ignored by a private cache.

   Note that most older caches, not compliant with this specification,
   do not implement any cache-control directives. An origin server
   wishing to use a cache-control directive that restricts, but does not
   prevent, caching by an HTTP/1.1-compliant cache MAY exploit the
   requirement that the max-age directive overrides the Expires header,
   and the fact that pre-HTTP/1.1-compliant caches do not observe the
   max-age directive.

   Other directives allow a user agent to modify the basic expiration
   mechanism. These directives MAY be specified on a request:

   max-age
      Indicates that the client is willing to accept a response whose
      age is no greater than the specified time in seconds. Unless max-
      stale directive is also included, the client is not willing to
      accept a stale response.

   min-fresh
      Indicates that the client is willing to accept a response whose
      freshness lifetime is no less than its current age plus the
      specified time in seconds. That is, the client wants a response
      that will still be fresh for at least the specified number of
      seconds.

   max-stale
      Indicates that the client is willing to accept a response that has
      exceeded its expiration time. If max-stale is assigned a value,
      then the client is willing to accept a response that has exceeded
      its expiration time by no more than the specified number of
      seconds. If no value is assigned to max-stale, then the client is
      willing to accept a stale response of any age.

   If a cache returns a stale response, either because of a max-stale
   directive on a request, or because the cache is configured to
   override the expiration time of a response, the cache MUST attach a
   Warning header to the stale response, using Warning 110 (Response is
   stale).



Fielding, et al.            Standards Track                   [Page 112]

RFC 2616                        HTTP/1.1                       June 1999


   A cache MAY be configured to return stale responses without
   validation, but only if this does not conflict with any "MUST"-level
   requirements concerning cache validation (e.g., a "must-revalidate"
   cache-control directive).

   If both the new request and the cached entry include "max-age"
   directives, then the lesser of the two values is used for determining
   the freshness of the cached entry for that request.

14.9.4 Cache Revalidation and Reload Controls

   Sometimes a user agent might want or need to insist that a cache
   revalidate its cache entry with the origin server (and not just with
   the next cache along the path to the origin server), or to reload its
   cache entry from the origin server. End-to-end revalidation might be
   necessary if either the cache or the origin server has overestimated
   the expiration time of the cached response. End-to-end reload may be
   necessary if the cache entry has become corrupted for some reason.

   End-to-end revalidation may be requested either when the client does
   not have its own local cached copy, in which case we call it
   "unspecified end-to-end revalidation", or when the client does have a
   local cached copy, in which case we call it "specific end-to-end
   revalidation."

   The client can specify these three kinds of action using Cache-
   Control request directives:

   End-to-end reload
      The request includes a "no-cache" cache-control directive or, for
      compatibility with HTTP/1.0 clients, "Pragma: no-cache". Field
      names MUST NOT be included with the no-cache directive in a
      request. The server MUST NOT use a cached copy when responding to
      such a request.

   Specific end-to-end revalidation
      The request includes a "max-age=0" cache-control directive, which
      forces each cache along the path to the origin server to
      revalidate its own entry, if any, with the next cache or server.
      The initial request includes a cache-validating conditional with
      the client's current validator.

   Unspecified end-to-end revalidation
      The request includes "max-age=0" cache-control directive, which
      forces each cache along the path to the origin server to
      revalidate its own entry, if any, with the next cache or server.
      The initial request does not include a cache-validating




Fielding, et al.            Standards Track                   [Page 113]

RFC 2616                        HTTP/1.1                       June 1999


      conditional; the first cache along the path (if any) that holds a
      cache entry for this resource includes a cache-validating
      conditional with its current validator.

   max-age
      When an intermediate cache is forced, by means of a max-age=0
      directive, to revalidate its own cache entry, and the client has
      supplied its own validator in the request, the supplied validator
      might differ from the validator currently stored with the cache
      entry. In this case, the cache MAY use either validator in making
      its own request without affecting semantic transparency.

      However, the choice of validator might affect performance. The
      best approach is for the intermediate cache to use its own
      validator when making its request. If the server replies with 304
      (Not Modified), then the cache can return its now validated copy
      to the client with a 200 (OK) response. If the server replies with
      a new entity and cache validator, however, the intermediate cache
      can compare the returned validator with the one provided in the
      client's request, using the strong comparison function. If the
      client's validator is equal to the origin server's, then the
      intermediate cache simply returns 304 (Not Modified). Otherwise,
      it returns the new entity with a 200 (OK) response.

      If a request includes the no-cache directive, it SHOULD NOT
      include min-fresh, max-stale, or max-age.

   only-if-cached
      In some cases, such as times of extremely poor network
      connectivity, a client may want a cache to return only those
      responses that it currently has stored, and not to reload or
      revalidate with the origin server. To do this, the client may
      include the only-if-cached directive in a request. If it receives
      this directive, a cache SHOULD either respond using a cached entry
      that is consistent with the other constraints of the request, or
      respond with a 504 (Gateway Timeout) status. However, if a group
      of caches is being operated as a unified system with good internal
      connectivity, such a request MAY be forwarded within that group of
      caches.

   must-revalidate
      Because a cache MAY be configured to ignore a server's specified
      expiration time, and because a client request MAY include a max-
      stale directive (which has a similar effect), the protocol also
      includes a mechanism for the origin server to require revalidation
      of a cache entry on any subsequent use. When the must-revalidate
      directive is present in a response received by a cache, that cache
      MUST NOT use the entry after it becomes stale to respond to a



Fielding, et al.            Standards Track                   [Page 114]

RFC 2616                        HTTP/1.1                       June 1999


      subsequent request without first revalidating it with the origin
      server. (I.e., the cache MUST do an end-to-end revalidation every
      time, if, based solely on the origin server's Expires or max-age
      value, the cached response is stale.)

      The must-revalidate directive is necessary to support reliable
      operation for certain protocol features. In all circumstances an
      HTTP/1.1 cache MUST obey the must-revalidate directive; in
      particular, if the cache cannot reach the origin server for any
      reason, it MUST generate a 504 (Gateway Timeout) response.

      Servers SHOULD send the must-revalidate directive if and only if
      failure to revalidate a request on the entity could result in
      incorrect operation, such as a silently unexecuted financial
      transaction. Recipients MUST NOT take any automated action that
      violates this directive, and MUST NOT automatically provide an
      unvalidated copy of the entity if revalidation fails.

      Although this is not recommended, user agents operating under
      severe connectivity constraints MAY violate this directive but, if
      so, MUST explicitly warn the user that an unvalidated response has
      been provided. The warning MUST be provided on each unvalidated
      access, and SHOULD require explicit user confirmation.

   proxy-revalidate
      The proxy-revalidate directive has the same meaning as the must-
      revalidate directive, except that it does not apply to non-shared
      user agent caches. It can be used on a response to an
      authenticated request to permit the user's cache to store and
      later return the response without needing to revalidate it (since
      it has already been authenticated once by that user), while still
      requiring proxies that service many users to revalidate each time
      (in order to make sure that each user has been authenticated).
      Note that such authenticated responses also need the public cache
      control directive in order to allow them to be cached at all.

14.9.5 No-Transform Directive

   no-transform
      Implementors of intermediate caches (proxies) have found it useful
      to convert the media type of certain entity bodies. A non-
      transparent proxy might, for example, convert between image
      formats in order to save cache space or to reduce the amount of
      traffic on a slow link.

      Serious operational problems occur, however, when these
      transformations are applied to entity bodies intended for certain
      kinds of applications. For example, applications for medical



Fielding, et al.            Standards Track                   [Page 115]

RFC 2616                        HTTP/1.1                       June 1999


      imaging, scientific data analysis and those using end-to-end
      authentication, all depend on receiving an entity body that is bit
      for bit identical to the original entity-body.

      Therefore, if a message includes the no-transform directive, an
      intermediate cache or proxy MUST NOT change those headers that are
      listed in section 13.5.2 as being subject to the no-transform
      directive. This implies that the cache or proxy MUST NOT change
      any aspect of the entity-body that is specified by these headers,
      including the value of the entity-body itself.

14.9.6 Cache Control Extensions

   The Cache-Control header field can be extended through the use of one
   or more cache-extension tokens, each with an optional assigned value.
   Informational extensions (those which do not require a change in
   cache behavior) MAY be added without changing the semantics of other
   directives. Behavioral extensions are designed to work by acting as
   modifiers to the existing base of cache directives. Both the new
   directive and the standard directive are supplied, such that
   applications which do not understand the new directive will default
   to the behavior specified by the standard directive, and those that
   understand the new directive will recognize it as modifying the
   requirements associated with the standard directive. In this way,
   extensions to the cache-control directives can be made without
   requiring changes to the base protocol.

   This extension mechanism depends on an HTTP cache obeying all of the
   cache-control directives defined for its native HTTP-version, obeying
   certain extensions, and ignoring all directives that it does not
   understand.

   For example, consider a hypothetical new response directive called
   community which acts as a modifier to the private directive. We
   define this new directive to mean that, in addition to any non-shared
   cache, any cache which is shared only by members of the community
   named within its value may cache the response. An origin server
   wishing to allow the UCI community to use an otherwise private
   response in their shared cache(s) could do so by including

       Cache-Control: private, community="UCI"

   A cache seeing this header field will act correctly even if the cache
   does not understand the community cache-extension, since it will also
   see and understand the private directive and thus default to the safe
   behavior.





Fielding, et al.            Standards Track                   [Page 116]

RFC 2616                        HTTP/1.1                       June 1999


   Unrecognized cache-directives MUST be ignored; it is assumed that any
   cache-directive likely to be unrecognized by an HTTP/1.1 cache will
   be combined with standard directives (or the response's default
   cacheability) such that the cache behavior will remain minimally
   correct even if the cache does not understand the extension(s).

14.10 Connection

   The Connection general-header field allows the sender to specify
   options that are desired for that particular connection and MUST NOT
   be communicated by proxies over further connections.

   The Connection header has the following grammar:

       Connection = "Connection" ":" 1#(connection-token)
       connection-token  = token

   HTTP/1.1 proxies MUST parse the Connection header field before a
   message is forwarded and, for each connection-token in this field,
   remove any header field(s) from the message with the same name as the
   connection-token. Connection options are signaled by the presence of
   a connection-token in the Connection header field, not by any
   corresponding additional header field(s), since the additional header
   field may not be sent if there are no parameters associated with that
   connection option.

   Message headers listed in the Connection header MUST NOT include
   end-to-end headers, such as Cache-Control.

   HTTP/1.1 defines the "close" connection option for the sender to
   signal that the connection will be closed after completion of the
   response. For example,

       Connection: close

   in either the request or the response header fields indicates that
   the connection SHOULD NOT be considered `persistent' (section 8.1)
   after the current request/response is complete.

   HTTP/1.1 applications that do not support persistent connections MUST
   include the "close" connection option in every message.

   A system receiving an HTTP/1.0 (or lower-version) message that
   includes a Connection header MUST, for each connection-token in this
   field, remove and ignore any header field(s) from the message with
   the same name as the connection-token. This protects against mistaken
   forwarding of such header fields by pre-HTTP/1.1 proxies. See section
   19.6.2.



Fielding, et al.            Standards Track                   [Page 117]

RFC 2616                        HTTP/1.1                       June 1999


14.11 Content-Encoding

   The Content-Encoding entity-header field is used as a modifier to the
   media-type. When present, its value indicates what additional content
   codings have been applied to the entity-body, and thus what decoding
   mechanisms must be applied in order to obtain the media-type
   referenced by the Content-Type header field. Content-Encoding is
   primarily used to allow a document to be compressed without losing
   the identity of its underlying media type.

       Content-Encoding  = "Content-Encoding" ":" 1#content-coding

   Content codings are defined in section 3.5. An example of its use is

       Content-Encoding: gzip

   The content-coding is a characteristic of the entity identified by
   the Request-URI. Typically, the entity-body is stored with this
   encoding and is only decoded before rendering or analogous usage.
   However, a non-transparent proxy MAY modify the content-coding if the
   new coding is known to be acceptable to the recipient, unless the
   "no-transform" cache-control directive is present in the message.

   If the content-coding of an entity is not "identity", then the
   response MUST include a Content-Encoding entity-header (section
   14.11) that lists the non-identity content-coding(s) used.

   If the content-coding of an entity in a request message is not
   acceptable to the origin server, the server SHOULD respond with a
   status code of 415 (Unsupported Media Type).

   If multiple encodings have been applied to an entity, the content
   codings MUST be listed in the order in which they were applied.
   Additional information about the encoding parameters MAY be provided
   by other entity-header fields not defined by this specification.

14.12 Content-Language

   The Content-Language entity-header field describes the natural
   language(s) of the intended audience for the enclosed entity. Note
   that this might not be equivalent to all the languages used within
   the entity-body.

       Content-Language  = "Content-Language" ":" 1#language-tag







Fielding, et al.            Standards Track                   [Page 118]

RFC 2616                        HTTP/1.1                       June 1999


   Language tags are defined in section 3.10. The primary purpose of
   Content-Language is to allow a user to identify and differentiate
   entities according to the user's own preferred language. Thus, if the
   body content is intended only for a Danish-literate audience, the
   appropriate field is

       Content-Language: da

   If no Content-Language is specified, the default is that the content
   is intended for all language audiences. This might mean that the
   sender does not consider it to be specific to any natural language,
   or that the sender does not know for which language it is intended.

   Multiple languages MAY be listed for content that is intended for
   multiple audiences. For example, a rendition of the "Treaty of
   Waitangi," presented simultaneously in the original Maori and English
   versions, would call for

       Content-Language: mi, en

   However, just because multiple languages are present within an entity
   does not mean that it is intended for multiple linguistic audiences.
   An example would be a beginner's language primer, such as "A First
   Lesson in Latin," which is clearly intended to be used by an
   English-literate audience. In this case, the Content-Language would
   properly only include "en".

   Content-Language MAY be applied to any media type -- it is not
   limited to textual documents.

14.13 Content-Length

   The Content-Length entity-header field indicates the size of the
   entity-body, in decimal number of OCTETs, sent to the recipient or,
   in the case of the HEAD method, the size of the entity-body that
   would have been sent had the request been a GET.

       Content-Length    = "Content-Length" ":" 1*DIGIT

   An example is

       Content-Length: 3495

   Applications SHOULD use this field to indicate the transfer-length of
   the message-body, unless this is prohibited by the rules in section
   4.4.





Fielding, et al.            Standards Track                   [Page 119]

RFC 2616                        HTTP/1.1                       June 1999


   Any Content-Length greater than or equal to zero is a valid value.
   Section 4.4 describes how to determine the length of a message-body
   if a Content-Length is not given.

   Note that the meaning of this field is significantly different from
   the corresponding definition in MIME, where it is an optional field
   used within the "message/external-body" content-type. In HTTP, it
   SHOULD be sent whenever the message's length can be determined prior
   to being transferred, unless this is prohibited by the rules in
   section 4.4.

14.14 Content-Location

   The Content-Location entity-header field MAY be used to supply the
   resource location for the entity enclosed in the message when that
   entity is accessible from a location separate from the requested
   resource's URI. A server SHOULD provide a Content-Location for the
   variant corresponding to the response entity; especially in the case
   where a resource has multiple entities associated with it, and those
   entities actually have separate locations by which they might be
   individually accessed, the server SHOULD provide a Content-Location
   for the particular variant which is returned.

       Content-Location = "Content-Location" ":"
                         ( absoluteURI | relativeURI )

   The value of Content-Location also defines the base URI for the
   entity.

   The Content-Location value is not a replacement for the original
   requested URI; it is only a statement of the location of the resource
   corresponding to this particular entity at the time of the request.
   Future requests MAY specify the Content-Location URI as the request-
   URI if the desire is to identify the source of that particular
   entity.

   A cache cannot assume that an entity with a Content-Location
   different from the URI used to retrieve it can be used to respond to
   later requests on that Content-Location URI. However, the Content-
   Location can be used to differentiate between multiple entities
   retrieved from a single requested resource, as described in section
   13.6.

   If the Content-Location is a relative URI, the relative URI is
   interpreted relative to the Request-URI.

   The meaning of the Content-Location header in PUT or POST requests is
   undefined; servers are free to ignore it in those cases.



Fielding, et al.            Standards Track                   [Page 120]

RFC 2616                        HTTP/1.1                       June 1999


14.15 Content-MD5

   The Content-MD5 entity-header field, as defined in RFC 1864 [23], is
   an MD5 digest of the entity-body for the purpose of providing an
   end-to-end message integrity check (MIC) of the entity-body. (Note: a
   MIC is good for detecting accidental modification of the entity-body
   in transit, but is not proof against malicious attacks.)

        Content-MD5   = "Content-MD5" ":" md5-digest
        md5-digest   = <base64 of 128 bit MD5 digest as per RFC 1864>

   The Content-MD5 header field MAY be generated by an origin server or
   client to function as an integrity check of the entity-body. Only
   origin servers or clients MAY generate the Content-MD5 header field;
   proxies and gateways MUST NOT generate it, as this would defeat its
   value as an end-to-end integrity check. Any recipient of the entity-
   body, including gateways and proxies, MAY check that the digest value
   in this header field matches that of the entity-body as received.

   The MD5 digest is computed based on the content of the entity-body,
   including any content-coding that has been applied, but not including
   any transfer-encoding applied to the message-body. If the message is
   received with a transfer-encoding, that encoding MUST be removed
   prior to checking the Content-MD5 value against the received entity.

   This has the result that the digest is computed on the octets of the
   entity-body exactly as, and in the order that, they would be sent if
   no transfer-encoding were being applied.

   HTTP extends RFC 1864 to permit the digest to be computed for MIME
   composite media-types (e.g., multipart/* and message/rfc822), but
   this does not change how the digest is computed as defined in the
   preceding paragraph.

   There are several consequences of this. The entity-body for composite
   types MAY contain many body-parts, each with its own MIME and HTTP
   headers (including Content-MD5, Content-Transfer-Encoding, and
   Content-Encoding headers). If a body-part has a Content-Transfer-
   Encoding or Content-Encoding header, it is assumed that the content
   of the body-part has had the encoding applied, and the body-part is
   included in the Content-MD5 digest as is -- i.e., after the
   application. The Transfer-Encoding header field is not allowed within
   body-parts.

   Conversion of all line breaks to CRLF MUST NOT be done before
   computing or checking the digest: the line break convention used in
   the text actually transmitted MUST be left unaltered when computing
   the digest.



Fielding, et al.            Standards Track                   [Page 121]

RFC 2616                        HTTP/1.1                       June 1999


      Note: while the definition of Content-MD5 is exactly the same for
      HTTP as in RFC 1864 for MIME entity-bodies, there are several ways
      in which the application of Content-MD5 to HTTP entity-bodies
      differs from its application to MIME entity-bodies. One is that
      HTTP, unlike MIME, does not use Content-Transfer-Encoding, and
      does use Transfer-Encoding and Content-Encoding. Another is that
      HTTP more frequently uses binary content types than MIME, so it is
      worth noting that, in such cases, the byte order used to compute
      the digest is the transmission byte order defined for the type.
      Lastly, HTTP allows transmission of text types with any of several
      line break conventions and not just the canonical form using CRLF.

14.16 Content-Range

   The Content-Range entity-header is sent with a partial entity-body to
   specify where in the full entity-body the partial body should be
   applied. Range units are defined in section 3.12.

       Content-Range = "Content-Range" ":" content-range-spec

       content-range-spec      = byte-content-range-spec
       byte-content-range-spec = bytes-unit SP
                                 byte-range-resp-spec "/"
                                 ( instance-length | "*" )

       byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
                                      | "*"
       instance-length           = 1*DIGIT

   The header SHOULD indicate the total length of the full entity-body,
   unless this length is unknown or difficult to determine. The asterisk
   "*" character means that the instance-length is unknown at the time
   when the response was generated.

   Unlike byte-ranges-specifier values (see section 14.35.1), a byte-
   range-resp-spec MUST only specify one range, and MUST contain
   absolute byte positions for both the first and last byte of the
   range.

   A byte-content-range-spec with a byte-range-resp-spec whose last-
   byte-pos value is less than its first-byte-pos value, or whose
   instance-length value is less than or equal to its last-byte-pos
   value, is invalid. The recipient of an invalid byte-content-range-
   spec MUST ignore it and any content transferred along with it.

   A server sending a response with status code 416 (Requested range not
   satisfiable) SHOULD include a Content-Range field with a byte-range-
   resp-spec of "*". The instance-length specifies the current length of



Fielding, et al.            Standards Track                   [Page 122]

RFC 2616                        HTTP/1.1                       June 1999


   the selected resource. A response with status code 206 (Partial
   Content) MUST NOT include a Content-Range field with a byte-range-
   resp-spec of "*".

   Examples of byte-content-range-spec values, assuming that the entity
   contains a total of 1234 bytes:

      . The first 500 bytes:
       bytes 0-499/1234

      . The second 500 bytes:
       bytes 500-999/1234

      . All except for the first 500 bytes:
       bytes 500-1233/1234

      . The last 500 bytes:
       bytes 734-1233/1234

   When an HTTP message includes the content of a single range (for
   example, a response to a request for a single range, or to a request
   for a set of ranges that overlap without any holes), this content is
   transmitted with a Content-Range header, and a Content-Length header
   showing the number of bytes actually transferred. For example,

       HTTP/1.1 206 Partial content
       Date: Wed, 15 Nov 1995 06:25:24 GMT
       Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
       Content-Range: bytes 21010-47021/47022
       Content-Length: 26012
       Content-Type: image/gif

   When an HTTP message includes the content of multiple ranges (for
   example, a response to a request for multiple non-overlapping
   ranges), these are transmitted as a multipart message. The multipart
   media type used for this purpose is "multipart/byteranges" as defined
   in appendix 19.2. See appendix 19.6.3 for a compatibility issue.

   A response to a request for a single range MUST NOT be sent using the
   multipart/byteranges media type.  A response to a request for
   multiple ranges, whose result is a single range, MAY be sent as a
   multipart/byteranges media type with one part. A client that cannot
   decode a multipart/byteranges message MUST NOT ask for multiple
   byte-ranges in a single request.

   When a client requests multiple byte-ranges in one request, the
   server SHOULD return them in the order that they appeared in the
   request.



Fielding, et al.            Standards Track                   [Page 123]

RFC 2616                        HTTP/1.1                       June 1999


   If the server ignores a byte-range-spec because it is syntactically
   invalid, the server SHOULD treat the request as if the invalid Range
   header field did not exist. (Normally, this means return a 200
   response containing the full entity).

   If the server receives a request (other than one including an If-
   Range request-header field) with an unsatisfiable Range request-
   header field (that is, all of whose byte-range-spec values have a
   first-byte-pos value greater than the current length of the selected
   resource), it SHOULD return a response code of 416 (Requested range
   not satisfiable) (section 10.4.17).

      Note: clients cannot depend on servers to send a 416 (Requested
      range not satisfiable) response instead of a 200 (OK) response for
      an unsatisfiable Range request-header, since not all servers
      implement this request-header.

14.17 Content-Type

   The Content-Type entity-header field indicates the media type of the
   entity-body sent to the recipient or, in the case of the HEAD method,
   the media type that would have been sent had the request been a GET.

       Content-Type   = "Content-Type" ":" media-type

   Media types are defined in section 3.7. An example of the field is

       Content-Type: text/html; charset=ISO-8859-4

   Further discussion of methods for identifying the media type of an
   entity is provided in section 7.2.1.

14.18 Date

   The Date general-header field represents the date and time at which
   the message was originated, having the same semantics as orig-date in
   RFC 822. The field value is an HTTP-date, as described in section
   3.3.1; it MUST be sent in RFC 1123 [8]-date format.

       Date  = "Date" ":" HTTP-date

   An example is

       Date: Tue, 15 Nov 1994 08:12:31 GMT

   Origin servers MUST include a Date header field in all responses,
   except in these cases:




Fielding, et al.            Standards Track                   [Page 124]

RFC 2616                        HTTP/1.1                       June 1999


      1. If the response status code is 100 (Continue) or 101 (Switching
         Protocols), the response MAY include a Date header field, at
         the server's option.

      2. If the response status code conveys a server error, e.g. 500
         (Internal Server Error) or 503 (Service Unavailable), and it is
         inconvenient or impossible to generate a valid Date.

      3. If the server does not have a clock that can provide a
         reasonable approximation of the current time, its responses
         MUST NOT include a Date header field. In this case, the rules
         in section 14.18.1 MUST be followed.

   A received message that does not have a Date header field MUST be
   assigned one by the recipient if the message will be cached by that
   recipient or gatewayed via a protocol which requires a Date. An HTTP
   implementation without a clock MUST NOT cache responses without
   revalidating them on every use. An HTTP cache, especially a shared
   cache, SHOULD use a mechanism, such as NTP [28], to synchronize its
   clock with a reliable external standard.

   Clients SHOULD only send a Date header field in messages that include
   an entity-body, as in the case of the PUT and POST requests, and even
   then it is optional. A client without a clock MUST NOT send a Date
   header field in a request.

   The HTTP-date sent in a Date header SHOULD NOT represent a date and
   time subsequent to the generation of the message. It SHOULD represent
   the best available approximation of the date and time of message
   generation, unless the implementation has no means of generating a
   reasonably accurate date and time. In theory, the date ought to
   represent the moment just before the entity is generated. In
   practice, the date can be generated at any time during the message
   origination without affecting its semantic value.

14.18.1 Clockless Origin Server Operation

   Some origin server implementations might not have a clock available.
   An origin server without a clock MUST NOT assign Expires or Last-
   Modified values to a response, unless these values were associated
   with the resource by a system or user with a reliable clock. It MAY
   assign an Expires value that is known, at or before server
   configuration time, to be in the past (this allows "pre-expiration"
   of responses without storing separate Expires values for each
   resource).






Fielding, et al.            Standards Track                   [Page 125]

RFC 2616                        HTTP/1.1                       June 1999


14.19 ETag

   The ETag response-header field provides the current value of the
   entity tag for the requested variant. The headers used with entity
   tags are described in sections 14.24, 14.26 and 14.44. The entity tag
   MAY be used for comparison with other entities from the same resource
   (see section 13.3.3).

      ETag = "ETag" ":" entity-tag

   Examples:

      ETag: "xyzzy"
      ETag: W/"xyzzy"
      ETag: ""

14.20 Expect

   The Expect request-header field is used to indicate that particular
   server behaviors are required by the client.

      Expect       =  "Expect" ":" 1#expectation

      expectation  =  "100-continue" | expectation-extension
      expectation-extension =  token [ "=" ( token | quoted-string )
                               *expect-params ]
      expect-params =  ";" token [ "=" ( token | quoted-string ) ]


   A server that does not understand or is unable to comply with any of
   the expectation values in the Expect field of a request MUST respond
   with appropriate error status. The server MUST respond with a 417
   (Expectation Failed) status if any of the expectations cannot be met
   or, if there are other problems with the request, some other 4xx
   status.

   This header field is defined with extensible syntax to allow for
   future extensions. If a server receives a request containing an
   Expect field that includes an expectation-extension that it does not
   support, it MUST respond with a 417 (Expectation Failed) status.

   Comparison of expectation values is case-insensitive for unquoted
   tokens (including the 100-continue token), and is case-sensitive for
   quoted-string expectation-extensions.







Fielding, et al.            Standards Track                   [Page 126]

RFC 2616                        HTTP/1.1                       June 1999


   The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST
   return a 417 (Expectation Failed) status if it receives a request
   with an expectation that it cannot meet. However, the Expect
   request-header itself is end-to-end; it MUST be forwarded if the
   request is forwarded.

   Many older HTTP/1.0 and HTTP/1.1 applications do not understand the
   Expect header.

   See section 8.2.3 for the use of the 100 (continue) status.

14.21 Expires

   The Expires entity-header field gives the date/time after which the
   response is considered stale. A stale cache entry may not normally be
   returned by a cache (either a proxy cache or a user agent cache)
   unless it is first validated with the origin server (or with an
   intermediate cache that has a fresh copy of the entity). See section
   13.2 for further discussion of the expiration model.

   The presence of an Expires field does not imply that the original
   resource will change or cease to exist at, before, or after that
   time.

   The format is an absolute date and time as defined by HTTP-date in
   section 3.3.1; it MUST be in RFC 1123 date format:

      Expires = "Expires" ":" HTTP-date

   An example of its use is

      Expires: Thu, 01 Dec 1994 16:00:00 GMT

      Note: if a response includes a Cache-Control field with the max-
      age directive (see section 14.9.3), that directive overrides the
      Expires field.

   HTTP/1.1 clients and caches MUST treat other invalid date formats,
   especially including the value "0", as in the past (i.e., "already
   expired").

   To mark a response as "already expired," an origin server sends an
   Expires date that is equal to the Date header value. (See the rules
   for expiration calculations in section 13.2.4.)







Fielding, et al.            Standards Track                   [Page 127]

RFC 2616                        HTTP/1.1                       June 1999


   To mark a response as "never expires," an origin server sends an
   Expires date approximately one year from the time the response is
   sent. HTTP/1.1 servers SHOULD NOT send Expires dates more than one
   year in the future.

   The presence of an Expires header field with a date value of some
   time in the future on a response that otherwise would by default be
   non-cacheable indicates that the response is cacheable, unless
   indicated otherwise by a Cache-Control header field (section 14.9).

14.22 From

   The From request-header field, if given, SHOULD contain an Internet
   e-mail address for the human user who controls the requesting user
   agent. The address SHOULD be machine-usable, as defined by "mailbox"
   in RFC 822 [9] as updated by RFC 1123 [8]:

       From   = "From" ":" mailbox

   An example is:

       From: webmaster@w3.org

   This header field MAY be used for logging purposes and as a means for
   identifying the source of invalid or unwanted requests. It SHOULD NOT
   be used as an insecure form of access protection. The interpretation
   of this field is that the request is being performed on behalf of the
   person given, who accepts responsibility for the method performed. In
   particular, robot agents SHOULD include this header so that the
   person responsible for running the robot can be contacted if problems
   occur on the receiving end.

   The Internet e-mail address in this field MAY be separate from the
   Internet host which issued the request. For example, when a request
   is passed through a proxy the original issuer's address SHOULD be
   used.

   The client SHOULD NOT send the From header field without the user's
   approval, as it might conflict with the user's privacy interests or
   their site's security policy. It is strongly recommended that the
   user be able to disable, enable, and modify the value of this field
   at any time prior to a request.

14.23 Host

   The Host request-header field specifies the Internet host and port
   number of the resource being requested, as obtained from the original
   URI given by the user or referring resource (generally an HTTP URL,



Fielding, et al.            Standards Track                   [Page 128]

RFC 2616                        HTTP/1.1                       June 1999


   as described in section 3.2.2). The Host field value MUST represent
   the naming authority of the origin server or gateway given by the
   original URL. This allows the origin server or gateway to
   differentiate between internally-ambiguous URLs, such as the root "/"
   URL of a server for multiple host names on a single IP address.

       Host = "Host" ":" host [ ":" port ] ; Section 3.2.2

   A "host" without any trailing port information implies the default
   port for the service requested (e.g., "80" for an HTTP URL). For
   example, a request on the origin server for
   <http://www.w3.org/pub/WWW/> would properly include:

       GET /pub/WWW/ HTTP/1.1
       Host: www.w3.org

   A client MUST include a Host header field in all HTTP/1.1 request
   messages . If the requested URI does not include an Internet host
   name for the service being requested, then the Host header field MUST
   be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
   request message it forwards does contain an appropriate Host header
   field that identifies the service being requested by the proxy. All
   Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
   status code to any HTTP/1.1 request message which lacks a Host header
   field.

   See sections 5.2 and 19.6.1.1 for other requirements relating to
   Host.

14.24 If-Match

   The If-Match request-header field is used with a method to make it
   conditional. A client that has one or more entities previously
   obtained from the resource can verify that one of those entities is
   current by including a list of their associated entity tags in the
   If-Match header field. Entity tags are defined in section 3.11. The
   purpose of this feature is to allow efficient updates of cached
   information with a minimum amount of transaction overhead. It is also
   used, on updating requests, to prevent inadvertent modification of
   the wrong version of a resource. As a special case, the value "*"
   matches any current entity of the resource.

       If-Match = "If-Match" ":" ( "*" | 1#entity-tag )

   If any of the entity tags match the entity tag of the entity that
   would have been returned in the response to a similar GET request
   (without the If-Match header) on that resource, or if "*" is given




Fielding, et al.            Standards Track                   [Page 129]

RFC 2616                        HTTP/1.1                       June 1999


   and any current entity exists for that resource, then the server MAY
   perform the requested method as if the If-Match header field did not
   exist.

   A server MUST use the strong comparison function (see section 13.3.3)
   to compare the entity tags in If-Match.

   If none of the entity tags match, or if "*" is given and no current
   entity exists, the server MUST NOT perform the requested method, and
   MUST return a 412 (Precondition Failed) response. This behavior is
   most useful when the client wants to prevent an updating method, such
   as PUT, from modifying a resource that has changed since the client
   last retrieved it.

   If the request would, without the If-Match header field, result in
   anything other than a 2xx or 412 status, then the If-Match header
   MUST be ignored.

   The meaning of "If-Match: *" is that the method SHOULD be performed
   if the representation selected by the origin server (or by a cache,
   possibly using the Vary mechanism, see section 14.44) exists, and
   MUST NOT be performed if the representation does not exist.

   A request intended to update a resource (e.g., a PUT) MAY include an
   If-Match header field to signal that the request method MUST NOT be
   applied if the entity corresponding to the If-Match value (a single
   entity tag) is no longer a representation of that resource. This
   allows the user to indicate that they do not wish the request to be
   successful if the resource has been changed without their knowledge.
   Examples:

       If-Match: "xyzzy"
       If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
       If-Match: *

   The result of a request having both an If-Match header field and
   either an If-None-Match or an If-Modified-Since header fields is
   undefined by this specification.

14.25 If-Modified-Since

   The If-Modified-Since request-header field is used with a method to
   make it conditional: if the requested variant has not been modified
   since the time specified in this field, an entity will not be
   returned from the server; instead, a 304 (not modified) response will
   be returned without any message-body.

       If-Modified-Since = "If-Modified-Since" ":" HTTP-date



Fielding, et al.            Standards Track                   [Page 130]

RFC 2616                        HTTP/1.1                       June 1999


   An example of the field is:

       If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

   A GET method with an If-Modified-Since header and no Range header
   requests that the identified entity be transferred only if it has
   been modified since the date given by the If-Modified-Since header.
   The algorithm for determining this includes the following cases:

      a) If the request would normally result in anything other than a
         200 (OK) status, or if the passed If-Modified-Since date is
         invalid, the response is exactly the same as for a normal GET.
         A date which is later than the server's current time is
         invalid.

      b) If the variant has been modified since the If-Modified-Since
         date, the response is exactly the same as for a normal GET.

      c) If the variant has not been modified since a valid If-
         Modified-Since date, the server SHOULD return a 304 (Not
         Modified) response.

   The purpose of this feature is to allow efficient updates of cached
   information with a minimum amount of transaction overhead.

      Note: The Range request-header field modifies the meaning of If-
      Modified-Since; see section 14.35 for full details.

      Note: If-Modified-Since times are interpreted by the server, whose
      clock might not be synchronized with the client.

      Note: When handling an If-Modified-Since header field, some
      servers will use an exact date comparison function, rather than a
      less-than function, for deciding whether to send a 304 (Not
      Modified) response. To get best results when sending an If-
      Modified-Since header field for cache validation, clients are
      advised to use the exact date string received in a previous Last-
      Modified header field whenever possible.

      Note: If a client uses an arbitrary date in the If-Modified-Since
      header instead of a date taken from the Last-Modified header for
      the same request, the client should be aware of the fact that this
      date is interpreted in the server's understanding of time. The
      client should consider unsynchronized clocks and rounding problems
      due to the different encodings of time between the client and
      server. This includes the possibility of race conditions if the
      document has changed between the time it was first requested and
      the If-Modified-Since date of a subsequent request, and the



Fielding, et al.            Standards Track                   [Page 131]

RFC 2616                        HTTP/1.1                       June 1999


      possibility of clock-skew-related problems if the If-Modified-
      Since date is derived from the client's clock without correction
      to the server's clock. Corrections for different time bases
      between client and server are at best approximate due to network
      latency.

   The result of a request having both an If-Modified-Since header field
   and either an If-Match or an If-Unmodified-Since header fields is
   undefined by this specification.

14.26 If-None-Match

   The If-None-Match request-header field is used with a method to make
   it conditional. A client that has one or more entities previously
   obtained from the resource can verify that none of those entities is
   current by including a list of their associated entity tags in the
   If-None-Match header field. The purpose of this feature is to allow
   efficient updates of cached information with a minimum amount of
   transaction overhead. It is also used to prevent a method (e.g. PUT)
   from inadvertently modifying an existing resource when the client
   believes that the resource does not exist.

   As a special case, the value "*" matches any current entity of the
   resource.

       If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )

   If any of the entity tags match the entity tag of the entity that
   would have been returned in the response to a similar GET request
   (without the If-None-Match header) on that resource, or if "*" is
   given and any current entity exists for that resource, then the
   server MUST NOT perform the requested method, unless required to do
   so because the resource's modification date fails to match that
   supplied in an If-Modified-Since header field in the request.
   Instead, if the request method was GET or HEAD, the server SHOULD
   respond with a 304 (Not Modified) response, including the cache-
   related header fields (particularly ETag) of one of the entities that
   matched. For all other request methods, the server MUST respond with
   a status of 412 (Precondition Failed).

   See section 13.3.3 for rules on how to determine if two entities tags
   match. The weak comparison function can only be used with GET or HEAD
   requests.








Fielding, et al.            Standards Track                   [Page 132]

RFC 2616                        HTTP/1.1                       June 1999


   If none of the entity tags match, then the server MAY perform the
   requested method as if the If-None-Match header field did not exist,
   but MUST also ignore any If-Modified-Since header field(s) in the
   request. That is, if no entity tags match, then the server MUST NOT
   return a 304 (Not Modified) response.

   If the request would, without the If-None-Match header field, result
   in anything other than a 2xx or 304 status, then the If-None-Match
   header MUST be ignored. (See section 13.3.4 for a discussion of
   server behavior when both If-Modified-Since and If-None-Match appear
   in the same request.)

   The meaning of "If-None-Match: *" is that the method MUST NOT be
   performed if the representation selected by the origin server (or by
   a cache, possibly using the Vary mechanism, see section 14.44)
   exists, and SHOULD be performed if the representation does not exist.
   This feature is intended to be useful in preventing races between PUT
   operations.

   Examples:

       If-None-Match: "xyzzy"
       If-None-Match: W/"xyzzy"
       If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
       If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
       If-None-Match: *

   The result of a request having both an If-None-Match header field and
   either an If-Match or an If-Unmodified-Since header fields is
   undefined by this specification.

14.27 If-Range

   If a client has a partial copy of an entity in its cache, and wishes
   to have an up-to-date copy of the entire entity in its cache, it
   could use the Range request-header with a conditional GET (using
   either or both of If-Unmodified-Since and If-Match.) However, if the
   condition fails because the entity has been modified, the client
   would then have to make a second request to obtain the entire current
   entity-body.

   The If-Range header allows a client to "short-circuit" the second
   request. Informally, its meaning is `if the entity is unchanged, send
   me the part(s) that I am missing; otherwise, send me the entire new
   entity'.

        If-Range = "If-Range" ":" ( entity-tag | HTTP-date )




Fielding, et al.            Standards Track                   [Page 133]

RFC 2616                        HTTP/1.1                       June 1999


   If the client has no entity tag for an entity, but does have a Last-
   Modified date, it MAY use that date in an If-Range header. (The
   server can distinguish between a valid HTTP-date and any form of
   entity-tag by examining no more than two characters.) The If-Range
   header SHOULD only be used together with a Range header, and MUST be
   ignored if the request does not include a Range header, or if the
   server does not support the sub-range operation.

   If the entity tag given in the If-Range header matches the current
   entity tag for the entity, then the server SHOULD provide the
   specified sub-range of the entity using a 206 (Partial content)
   response. If the entity tag does not match, then the server SHOULD
   return the entire entity using a 200 (OK) response.

14.28 If-Unmodified-Since

   The If-Unmodified-Since request-header field is used with a method to
   make it conditional. If the requested resource has not been modified
   since the time specified in this field, the server SHOULD perform the
   requested operation as if the If-Unmodified-Since header were not
   present.

   If the requested variant has been modified since the specified time,
   the server MUST NOT perform the requested operation, and MUST return
   a 412 (Precondition Failed).

      If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date

   An example of the field is:

       If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

   If the request normally (i.e., without the If-Unmodified-Since
   header) would result in anything other than a 2xx or 412 status, the
   If-Unmodified-Since header SHOULD be ignored.

   If the specified date is invalid, the header is ignored.

   The result of a request having both an If-Unmodified-Since header
   field and either an If-None-Match or an If-Modified-Since header
   fields is undefined by this specification.

14.29 Last-Modified

   The Last-Modified entity-header field indicates the date and time at
   which the origin server believes the variant was last modified.

       Last-Modified  = "Last-Modified" ":" HTTP-date



Fielding, et al.            Standards Track                   [Page 134]

RFC 2616                        HTTP/1.1                       June 1999


   An example of its use is

       Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

   The exact meaning of this header field depends on the implementation
   of the origin server and the nature of the original resource. For
   files, it may be just the file system last-modified time. For
   entities with dynamically included parts, it may be the most recent
   of the set of last-modify times for its component parts. For database
   gateways, it may be the last-update time stamp of the record. For
   virtual objects, it may be the last time the internal state changed.

   An origin server MUST NOT send a Last-Modified date which is later
   than the server's time of message origination. In such cases, where
   the resource's last modification would indicate some time in the
   future, the server MUST replace that date with the message
   origination date.

   An origin server SHOULD obtain the Last-Modified value of the entity
   as close as possible to the time that it generates the Date value of
   its response. This allows a recipient to make an accurate assessment
   of the entity's modification time, especially if the entity changes
   near the time that the response is generated.

   HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.

14.30 Location

   The Location response-header field is used to redirect the recipient
   to a location other than the Request-URI for completion of the
   request or identification of a new resource. For 201 (Created)
   responses, the Location is that of the new resource which was created
   by the request. For 3xx responses, the location SHOULD indicate the
   server's preferred URI for automatic redirection to the resource. The
   field value consists of a single absolute URI.

       Location       = "Location" ":" absoluteURI

   An example is:

       Location: http://www.w3.org/pub/WWW/People.html

      Note: The Content-Location header field (section 14.14) differs
      from Location in that the Content-Location identifies the original
      location of the entity enclosed in the request. It is therefore
      possible for a response to contain header fields for both Location
      and Content-Location. Also see section 13.10 for cache
      requirements of some methods.



Fielding, et al.            Standards Track                   [Page 135]

RFC 2616                        HTTP/1.1                       June 1999


14.31 Max-Forwards

   The Max-Forwards request-header field provides a mechanism with the
   TRACE (section 9.8) and OPTIONS (section 9.2) methods to limit the
   number of proxies or gateways that can forward the request to the
   next inbound server. This can be useful when the client is attempting
   to trace a request chain which appears to be failing or looping in
   mid-chain.

       Max-Forwards   = "Max-Forwards" ":" 1*DIGIT

   The Max-Forwards value is a decimal integer indicating the remaining
   number of times this request message may be forwarded.

   Each proxy or gateway recipient of a TRACE or OPTIONS request
   containing a Max-Forwards header field MUST check and update its
   value prior to forwarding the request. If the received value is zero
   (0), the recipient MUST NOT forward the request; instead, it MUST
   respond as the final recipient. If the received Max-Forwards value is
   greater than zero, then the forwarded message MUST contain an updated
   Max-Forwards field with a value decremented by one (1).

   The Max-Forwards header field MAY be ignored for all other methods
   defined by this specification and for any extension methods for which
   it is not explicitly referred to as part of that method definition.

14.32 Pragma

   The Pragma general-header field is used to include implementation-
   specific directives that might apply to any recipient along the
   request/response chain. All pragma directives specify optional
   behavior from the viewpoint of the protocol; however, some systems
   MAY require that behavior be consistent with the directives.

       Pragma            = "Pragma" ":" 1#pragma-directive
       pragma-directive  = "no-cache" | extension-pragma
       extension-pragma  = token [ "=" ( token | quoted-string ) ]

   When the no-cache directive is present in a request message, an
   application SHOULD forward the request toward the origin server even
   if it has a cached copy of what is being requested. This pragma
   directive has the same semantics as the no-cache cache-directive (see
   section 14.9) and is defined here for backward compatibility with
   HTTP/1.0. Clients SHOULD include both header fields when a no-cache
   request is sent to a server not known to be HTTP/1.1 compliant.






Fielding, et al.            Standards Track                   [Page 136]

RFC 2616                        HTTP/1.1                       June 1999


   Pragma directives MUST be passed through by a proxy or gateway
   application, regardless of their significance to that application,
   since the directives might be applicable to all recipients along the
   request/response chain. It is not possible to specify a pragma for a
   specific recipient; however, any pragma directive not relevant to a
   recipient SHOULD be ignored by that recipient.

   HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
   sent "Cache-Control: no-cache". No new Pragma directives will be
   defined in HTTP.

      Note: because the meaning of "Pragma: no-cache as a response
      header field is not actually specified, it does not provide a
      reliable replacement for "Cache-Control: no-cache" in a response

14.33 Proxy-Authenticate

   The Proxy-Authenticate response-header field MUST be included as part
   of a 407 (Proxy Authentication Required) response. The field value
   consists of a challenge that indicates the authentication scheme and
   parameters applicable to the proxy for this Request-URI.

       Proxy-Authenticate  = "Proxy-Authenticate" ":" 1#challenge

   The HTTP access authentication process is described in "HTTP
   Authentication: Basic and Digest Access Authentication" [43]. Unlike
   WWW-Authenticate, the Proxy-Authenticate header field applies only to
   the current connection and SHOULD NOT be passed on to downstream
   clients. However, an intermediate proxy might need to obtain its own
   credentials by requesting them from the downstream client, which in
   some circumstances will appear as if the proxy is forwarding the
   Proxy-Authenticate header field.

14.34 Proxy-Authorization

   The Proxy-Authorization request-header field allows the client to
   identify itself (or its user) to a proxy which requires
   authentication. The Proxy-Authorization field value consists of
   credentials containing the authentication information of the user
   agent for the proxy and/or realm of the resource being requested.

       Proxy-Authorization     = "Proxy-Authorization" ":" credentials

   The HTTP access authentication process is described in "HTTP
   Authentication: Basic and Digest Access Authentication" [43] . Unlike
   Authorization, the Proxy-Authorization header field applies only to
   the next outbound proxy that demanded authentication using the Proxy-
   Authenticate field. When multiple proxies are used in a chain, the



Fielding, et al.            Standards Track                   [Page 137]

RFC 2616                        HTTP/1.1                       June 1999


   Proxy-Authorization header field is consumed by the first outbound
   proxy that was expecting to receive credentials. A proxy MAY relay
   the credentials from the client request to the next proxy if that is
   the mechanism by which the proxies cooperatively authenticate a given
   request.

14.35 Range

14.35.1 Byte Ranges

   Since all HTTP entities are represented in HTTP messages as sequences
   of bytes, the concept of a byte range is meaningful for any HTTP
   entity. (However, not all clients and servers need to support byte-
   range operations.)

   Byte range specifications in HTTP apply to the sequence of bytes in
   the entity-body (not necessarily the same as the message-body).

   A byte range operation MAY specify a single range of bytes, or a set
   of ranges within a single entity.

       ranges-specifier = byte-ranges-specifier
       byte-ranges-specifier = bytes-unit "=" byte-range-set
       byte-range-set  = 1#( byte-range-spec | suffix-byte-range-spec )
       byte-range-spec = first-byte-pos "-" [last-byte-pos]
       first-byte-pos  = 1*DIGIT
       last-byte-pos   = 1*DIGIT

   The first-byte-pos value in a byte-range-spec gives the byte-offset
   of the first byte in a range. The last-byte-pos value gives the
   byte-offset of the last byte in the range; that is, the byte
   positions specified are inclusive. Byte offsets start at zero.

   If the last-byte-pos value is present, it MUST be greater than or
   equal to the first-byte-pos in that byte-range-spec, or the byte-
   range-spec is syntactically invalid. The recipient of a byte-range-
   set that includes one or more syntactically invalid byte-range-spec
   values MUST ignore the header field that includes that byte-range-
   set.

   If the last-byte-pos value is absent, or if the value is greater than
   or equal to the current length of the entity-body, last-byte-pos is
   taken to be equal to one less than the current length of the entity-
   body in bytes.

   By its choice of last-byte-pos, a client can limit the number of
   bytes retrieved without knowing the size of the entity.




Fielding, et al.            Standards Track                   [Page 138]

RFC 2616                        HTTP/1.1                       June 1999


       suffix-byte-range-spec = "-" suffix-length
       suffix-length = 1*DIGIT

   A suffix-byte-range-spec is used to specify the suffix of the
   entity-body, of a length given by the suffix-length value. (That is,
   this form specifies the last N bytes of an entity-body.) If the
   entity is shorter than the specified suffix-length, the entire
   entity-body is used.

   If a syntactically valid byte-range-set includes at least one byte-
   range-spec whose first-byte-pos is less than the current length of
   the entity-body, or at least one suffix-byte-range-spec with a non-
   zero suffix-length, then the byte-range-set is satisfiable.
   Otherwise, the byte-range-set is unsatisfiable. If the byte-range-set
   is unsatisfiable, the server SHOULD return a response with a status
   of 416 (Requested range not satisfiable). Otherwise, the server
   SHOULD return a response with a status of 206 (Partial Content)
   containing the satisfiable ranges of the entity-body.

   Examples of byte-ranges-specifier values (assuming an entity-body of
   length 10000):

      - The first 500 bytes (byte offsets 0-499, inclusive):  bytes=0-
        499

      - The second 500 bytes (byte offsets 500-999, inclusive):
        bytes=500-999

      - The final 500 bytes (byte offsets 9500-9999, inclusive):
        bytes=-500

      - Or bytes=9500-

      - The first and last bytes only (bytes 0 and 9999):  bytes=0-0,-1

      - Several legal but not canonical specifications of the second 500
        bytes (byte offsets 500-999, inclusive):
         bytes=500-600,601-999
         bytes=500-700,601-999

14.35.2 Range Retrieval Requests

   HTTP retrieval requests using conditional or unconditional GET
   methods MAY request one or more sub-ranges of the entity, instead of
   the entire entity, using the Range request header, which applies to
   the entity returned as the result of the request:

      Range = "Range" ":" ranges-specifier



Fielding, et al.            Standards Track                   [Page 139]

RFC 2616                        HTTP/1.1                       June 1999


   A server MAY ignore the Range header. However, HTTP/1.1 origin
   servers and intermediate caches ought to support byte ranges when
   possible, since Range supports efficient recovery from partially
   failed transfers, and supports efficient partial retrieval of large
   entities.

   If the server supports the Range header and the specified range or
   ranges are appropriate for the entity:

      - The presence of a Range header in an unconditional GET modifies
        what is returned if the GET is otherwise successful. In other
        words, the response carries a status code of 206 (Partial
        Content) instead of 200 (OK).

      - The presence of a Range header in a conditional GET (a request
        using one or both of If-Modified-Since and If-None-Match, or
        one or both of If-Unmodified-Since and If-Match) modifies what
        is returned if the GET is otherwise successful and the
        condition is true. It does not affect the 304 (Not Modified)
        response returned if the conditional is false.

   In some cases, it might be more appropriate to use the If-Range
   header (see section 14.27) in addition to the Range header.

   If a proxy that supports ranges receives a Range request, forwards
   the request to an inbound server, and receives an entire entity in
   reply, it SHOULD only return the requested range to its client. It
   SHOULD store the entire received response in its cache if that is
   consistent with its cache allocation policies.

14.36 Referer

   The Referer[sic] request-header field allows the client to specify,
   for the server's benefit, the address (URI) of the resource from
   which the Request-URI was obtained (the "referrer", although the
   header field is misspelled.) The Referer request-header allows a
   server to generate lists of back-links to resources for interest,
   logging, optimized caching, etc. It also allows obsolete or mistyped
   links to be traced for maintenance. The Referer field MUST NOT be
   sent if the Request-URI was obtained from a source that does not have
   its own URI, such as input from the user keyboard.

       Referer        = "Referer" ":" ( absoluteURI | relativeURI )

   Example:

       Referer: http://www.w3.org/hypertext/DataSources/Overview.html




Fielding, et al.            Standards Track                   [Page 140]

RFC 2616                        HTTP/1.1                       June 1999


   If the field value is a relative URI, it SHOULD be interpreted
   relative to the Request-URI. The URI MUST NOT include a fragment. See
   section 15.1.3 for security considerations.

14.37 Retry-After

   The Retry-After response-header field can be used with a 503 (Service
   Unavailable) response to indicate how long the service is expected to
   be unavailable to the requesting client. This field MAY also be used
   with any 3xx (Redirection) response to indicate the minimum time the
   user-agent is asked wait before issuing the redirected request. The
   value of this field can be either an HTTP-date or an integer number
   of seconds (in decimal) after the time of the response.

       Retry-After  = "Retry-After" ":" ( HTTP-date | delta-seconds )

   Two examples of its use are

       Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
       Retry-After: 120

   In the latter example, the delay is 2 minutes.

14.38 Server

   The Server response-header field contains information about the
   software used by the origin server to handle the request. The field
   can contain multiple product tokens (section 3.8) and comments
   identifying the server and any significant subproducts. The product
   tokens are listed in order of their significance for identifying the
   application.

       Server         = "Server" ":" 1*( product | comment )

   Example:

       Server: CERN/3.0 libwww/2.17

   If the response is being forwarded through a proxy, the proxy
   application MUST NOT modify the Server response-header. Instead, it
   SHOULD include a Via field (as described in section 14.45).

      Note: Revealing the specific software version of the server might
      allow the server machine to become more vulnerable to attacks
      against software that is known to contain security holes. Server
      implementors are encouraged to make this field a configurable
      option.




Fielding, et al.            Standards Track                   [Page 141]

RFC 2616                        HTTP/1.1                       June 1999


14.39 TE

   The TE request-header field indicates what extension transfer-codings
   it is willing to accept in the response and whether or not it is
   willing to accept trailer fields in a chunked transfer-coding. Its
   value may consist of the keyword "trailers" and/or a comma-separated
   list of extension transfer-coding names with optional accept
   parameters (as described in section 3.6).

       TE        = "TE" ":" #( t-codings )
       t-codings = "trailers" | ( transfer-extension [ accept-params ] )

   The presence of the keyword "trailers" indicates that the client is
   willing to accept trailer fields in a chunked transfer-coding, as
   defined in section 3.6.1. This keyword is reserved for use with
   transfer-coding values even though it does not itself represent a
   transfer-coding.

   Examples of its use are:

       TE: deflate
       TE:
       TE: trailers, deflate;q=0.5

   The TE header field only applies to the immediate connection.
   Therefore, the keyword MUST be supplied within a Connection header
   field (section 14.10) whenever TE is present in an HTTP/1.1 message.

   A server tests whether a transfer-coding is acceptable, according to
   a TE field, using these rules:

      1. The "chunked" transfer-coding is always acceptable. If the
         keyword "trailers" is listed, the client indicates that it is
         willing to accept trailer fields in the chunked response on
         behalf of itself and any downstream clients. The implication is
         that, if given, the client is stating that either all
         downstream clients are willing to accept trailer fields in the
         forwarded response, or that it will attempt to buffer the
         response on behalf of downstream recipients.

         Note: HTTP/1.1 does not define any means to limit the size of a
         chunked response such that a client can be assured of buffering
         the entire response.

      2. If the transfer-coding being tested is one of the transfer-
         codings listed in the TE field, then it is acceptable unless it
         is accompanied by a qvalue of 0. (As defined in section 3.9, a
         qvalue of 0 means "not acceptable.")



Fielding, et al.            Standards Track                   [Page 142]

RFC 2616                        HTTP/1.1                       June 1999


      3. If multiple transfer-codings are acceptable, then the
         acceptable transfer-coding with the highest non-zero qvalue is
         preferred.  The "chunked" transfer-coding always has a qvalue
         of 1.

   If the TE field-value is empty or if no TE field is present, the only
   transfer-coding  is "chunked". A message with no transfer-coding is
   always acceptable.

14.40 Trailer

   The Trailer general field value indicates that the given set of
   header fields is present in the trailer of a message encoded with
   chunked transfer-coding.

       Trailer  = "Trailer" ":" 1#field-name

   An HTTP/1.1 message SHOULD include a Trailer header field in a
   message using chunked transfer-coding with a non-empty trailer. Doing
   so allows the recipient to know which header fields to expect in the
   trailer.

   If no Trailer header field is present, the trailer SHOULD NOT include
   any header fields. See section 3.6.1 for restrictions on the use of
   trailer fields in a "chunked" transfer-coding.

   Message header fields listed in the Trailer header field MUST NOT
   include the following header fields:

      . Transfer-Encoding

      . Content-Length

      . Trailer

14.41 Transfer-Encoding

   The Transfer-Encoding general-header field indicates what (if any)
   type of transformation has been applied to the message body in order
   to safely transfer it between the sender and the recipient. This
   differs from the content-coding in that the transfer-coding is a
   property of the message, not of the entity.

     Transfer-Encoding       = "Transfer-Encoding" ":" 1#transfer-coding

   Transfer-codings are defined in section 3.6. An example is:

     Transfer-Encoding: chunked



Fielding, et al.            Standards Track                   [Page 143]

RFC 2616                        HTTP/1.1                       June 1999


   If multiple encodings have been applied to an entity, the transfer-
   codings MUST be listed in the order in which they were applied.
   Additional information about the encoding parameters MAY be provided
   by other entity-header fields not defined by this specification.

   Many older HTTP/1.0 applications do not understand the Transfer-
   Encoding header.

14.42 Upgrade

   The Upgrade general-header allows the client to specify what
   additional communication protocols it supports and would like to use
   if the server finds it appropriate to switch protocols. The server
   MUST use the Upgrade header field within a 101 (Switching Protocols)
   response to indicate which protocol(s) are being switched.

       Upgrade        = "Upgrade" ":" 1#product

   For example,

       Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

   The Upgrade header field is intended to provide a simple mechanism
   for transition from HTTP/1.1 to some other, incompatible protocol. It
   does so by allowing the client to advertise its desire to use another
   protocol, such as a later version of HTTP with a higher major version
   number, even though the current request has been made using HTTP/1.1.
   This eases the difficult transition between incompatible protocols by
   allowing the client to initiate a request in the more commonly
   supported protocol while indicating to the server that it would like
   to use a "better" protocol if available (where "better" is determined
   by the server, possibly according to the nature of the method and/or
   resource being requested).

   The Upgrade header field only applies to switching application-layer
   protocols upon the existing transport-layer connection. Upgrade
   cannot be used to insist on a protocol change; its acceptance and use
   by the server is optional. The capabilities and nature of the
   application-layer communication after the protocol change is entirely
   dependent upon the new protocol chosen, although the first action
   after changing the protocol MUST be a response to the initial HTTP
   request containing the Upgrade header field.

   The Upgrade header field only applies to the immediate connection.
   Therefore, the upgrade keyword MUST be supplied within a Connection
   header field (section 14.10) whenever Upgrade is present in an
   HTTP/1.1 message.




Fielding, et al.            Standards Track                   [Page 144]

RFC 2616                        HTTP/1.1                       June 1999


   The Upgrade header field cannot be used to indicate a switch to a
   protocol on a different connection. For that purpose, it is more
   appropriate to use a 301, 302, 303, or 305 redirection response.

   This specification only defines the protocol name "HTTP" for use by
   the family of Hypertext Transfer Protocols, as defined by the HTTP
   version rules of section 3.1 and future updates to this
   specification. Any token can be used as a protocol name; however, it
   will only be useful if both the client and server associate the name
   with the same protocol.

14.43 User-Agent

   The User-Agent request-header field contains information about the
   user agent originating the request. This is for statistical purposes,
   the tracing of protocol violations, and automated recognition of user
   agents for the sake of tailoring responses to avoid particular user
   agent limitations. User agents SHOULD include this field with
   requests. The field can contain multiple product tokens (section 3.8)
   and comments identifying the agent and any subproducts which form a
   significant part of the user agent. By convention, the product tokens
   are listed in order of their significance for identifying the
   application.

       User-Agent     = "User-Agent" ":" 1*( product | comment )

   Example:

       User-Agent: CERN-LineMode/2.15 libwww/2.17b3

14.44 Vary

   The Vary field value indicates the set of request-header fields that
   fully determines, while the response is fresh, whether a cache is
   permitted to use the response to reply to a subsequent request
   without revalidation. For uncacheable or stale responses, the Vary
   field value advises the user agent about the criteria that were used
   to select the representation. A Vary field value of "*" implies that
   a cache cannot determine from the request headers of a subsequent
   request whether this response is the appropriate representation. See
   section 13.6 for use of the Vary header field by caches.

       Vary  = "Vary" ":" ( "*" | 1#field-name )

   An HTTP/1.1 server SHOULD include a Vary header field with any
   cacheable response that is subject to server-driven negotiation.
   Doing so allows a cache to properly interpret future requests on that
   resource and informs the user agent about the presence of negotiation



Fielding, et al.            Standards Track                   [Page 145]

RFC 2616                        HTTP/1.1                       June 1999


   on that resource. A server MAY include a Vary header field with a
   non-cacheable response that is subject to server-driven negotiation,
   since this might provide the user agent with useful information about
   the dimensions over which the response varies at the time of the
   response.

   A Vary field value consisting of a list of field-names signals that
   the representation selected for the response is based on a selection
   algorithm which considers ONLY the listed request-header field values
   in selecting the most appropriate representation. A cache MAY assume
   that the same selection will be made for future requests with the
   same values for the listed field names, for the duration of time for
   which the response is fresh.

   The field-names given are not limited to the set of standard
   request-header fields defined by this specification. Field names are
   case-insensitive.

   A Vary field value of "*" signals that unspecified parameters not
   limited to the request-headers (e.g., the network address of the
   client), play a role in the selection of the response representation.
   The "*" value MUST NOT be generated by a proxy server; it may only be
   generated by an origin server.

14.45  Via

   The Via general-header field MUST be used by gateways and proxies to
   indicate the intermediate protocols and recipients between the user
   agent and the server on requests, and between the origin server and
   the client on responses. It is analogous to the "Received" field of
   RFC 822 [9] and is intended to be used for tracking message forwards,
   avoiding request loops, and identifying the protocol capabilities of
   all senders along the request/response chain.

      Via =  "Via" ":" 1#( received-protocol received-by [ comment ] )
      received-protocol = [ protocol-name "/" ] protocol-version
      protocol-name     = token
      protocol-version  = token
      received-by       = ( host [ ":" port ] ) | pseudonym
      pseudonym         = token

   The received-protocol indicates the protocol version of the message
   received by the server or client along each segment of the
   request/response chain. The received-protocol version is appended to
   the Via field value when the message is forwarded so that information
   about the protocol capabilities of upstream applications remains
   visible to all recipients.




Fielding, et al.            Standards Track                   [Page 146]

RFC 2616                        HTTP/1.1                       June 1999


   The protocol-name is optional if and only if it would be "HTTP". The
   received-by field is normally the host and optional port number of a
   recipient server or client that subsequently forwarded the message.
   However, if the real host is considered to be sensitive information,
   it MAY be replaced by a pseudonym. If the port is not given, it MAY
   be assumed to be the default port of the received-protocol.

   Multiple Via field values represents each proxy or gateway that has
   forwarded the message. Each recipient MUST append its information
   such that the end result is ordered according to the sequence of
   forwarding applications.

   Comments MAY be used in the Via header field to identify the software
   of the recipient proxy or gateway, analogous to the User-Agent and
   Server header fields. However, all comments in the Via field are
   optional and MAY be removed by any recipient prior to forwarding the
   message.

   For example, a request message could be sent from an HTTP/1.0 user
   agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
   forward the request to a public proxy at nowhere.com, which completes
   the request by forwarding it to the origin server at www.ics.uci.edu.
   The request received by www.ics.uci.edu would then have the following
   Via header field:

       Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)

   Proxies and gateways used as a portal through a network firewall
   SHOULD NOT, by default, forward the names and ports of hosts within
   the firewall region. This information SHOULD only be propagated if
   explicitly enabled. If not enabled, the received-by host of any host
   behind the firewall SHOULD be replaced by an appropriate pseudonym
   for that host.

   For organizations that have strong privacy requirements for hiding
   internal structures, a proxy MAY combine an ordered subsequence of
   Via header field entries with identical received-protocol values into
   a single such entry. For example,

       Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy

        could be collapsed to

       Via: 1.0 ricky, 1.1 mertz, 1.0 lucy







Fielding, et al.            Standards Track                   [Page 147]

RFC 2616                        HTTP/1.1                       June 1999


   Applications SHOULD NOT combine multiple entries unless they are all
   under the same organizational control and the hosts have already been
   replaced by pseudonyms. Applications MUST NOT combine entries which
   have different received-protocol values.

14.46 Warning

   The Warning general-header field is used to carry additional
   information about the status or transformation of a message which
   might not be reflected in the message. This information is typically
   used to warn about a possible lack of semantic transparency from
   caching operations or transformations applied to the entity body of
   the message.

   Warning headers are sent with responses using:

       Warning    = "Warning" ":" 1#warning-value

       warning-value = warn-code SP warn-agent SP warn-text
                                             [SP warn-date]

       warn-code  = 3DIGIT
       warn-agent = ( host [ ":" port ] ) | pseudonym
                       ; the name or pseudonym of the server adding
                       ; the Warning header, for use in debugging
       warn-text  = quoted-string
       warn-date  = <"> HTTP-date <">

   A response MAY carry more than one Warning header.

   The warn-text SHOULD be in a natural language and character set that
   is most likely to be intelligible to the human user receiving the
   response. This decision MAY be based on any available knowledge, such
   as the location of the cache or user, the Accept-Language field in a
   request, the Content-Language field in a response, etc. The default
   language is English and the default character set is ISO-8859-1.

   If a character set other than ISO-8859-1 is used, it MUST be encoded
   in the warn-text using the method described in RFC 2047 [14].

   Warning headers can in general be applied to any message, however
   some specific warn-codes are specific to caches and can only be
   applied to response messages. New Warning headers SHOULD be added
   after any existing Warning headers. A cache MUST NOT delete any
   Warning header that it received with a message. However, if a cache
   successfully validates a cache entry, it SHOULD remove any Warning
   headers previously attached to that entry except as specified for




Fielding, et al.            Standards Track                   [Page 148]

RFC 2616                        HTTP/1.1                       June 1999


   specific Warning codes. It MUST then add any Warning headers received
   in the validating response. In other words, Warning headers are those
   that would be attached to the most recent relevant response.

   When multiple Warning headers are attached to a response, the user
   agent ought to inform the user of as many of them as possible, in the
   order that they appear in the response. If it is not possible to
   inform the user of all of the warnings, the user agent SHOULD follow
   these heuristics:

      - Warnings that appear early in the response take priority over
        those appearing later in the response.

      - Warnings in the user's preferred character set take priority
        over warnings in other character sets but with identical warn-
        codes and warn-agents.

   Systems that generate multiple Warning headers SHOULD order them with
   this user agent behavior in mind.

   Requirements for the behavior of caches with respect to Warnings are
   stated in section 13.1.2.

   This is a list of the currently-defined warn-codes, each with a
   recommended warn-text in English, and a description of its meaning.

   110 Response is stale
     MUST be included whenever the returned response is stale.

   111 Revalidation failed
     MUST be included if a cache returns a stale response because an
     attempt to revalidate the response failed, due to an inability to
     reach the server.

   112 Disconnected operation
     SHOULD be included if the cache is intentionally disconnected from
     the rest of the network for a period of time.

   113 Heuristic expiration
     MUST be included if the cache heuristically chose a freshness
     lifetime greater than 24 hours and the response's age is greater
     than 24 hours.

   199 Miscellaneous warning
     The warning text MAY include arbitrary information to be presented
     to a human user, or logged. A system receiving this warning MUST
     NOT take any automated action, besides presenting the warning to
     the user.



Fielding, et al.            Standards Track                   [Page 149]

RFC 2616                        HTTP/1.1                       June 1999


   214 Transformation applied
     MUST be added by an intermediate cache or proxy if it applies any
     transformation changing the content-coding (as specified in the
     Content-Encoding header) or media-type (as specified in the
     Content-Type header) of the response, or the entity-body of the
     response, unless this Warning code already appears in the response.

   299 Miscellaneous persistent warning
     The warning text MAY include arbitrary information to be presented
     to a human user, or logged. A system receiving this warning MUST
     NOT take any automated action.

   If an implementation sends a message with one or more Warning headers
   whose version is HTTP/1.0 or lower, then the sender MUST include in
   each warning-value a warn-date that matches the date in the response.

   If an implementation receives a message with a warning-value that
   includes a warn-date, and that warn-date is different from the Date
   value in the response, then that warning-value MUST be deleted from
   the message before storing, forwarding, or using it. (This prevents
   bad consequences of naive caching of Warning header fields.) If all
   of the warning-values are deleted for this reason, the Warning header
   MUST be deleted as well.

14.47 WWW-Authenticate

   The WWW-Authenticate response-header field MUST be included in 401
   (Unauthorized) response messages. The field value consists of at
   least one challenge that indicates the authentication scheme(s) and
   parameters applicable to the Request-URI.

       WWW-Authenticate  = "WWW-Authenticate" ":" 1#challenge

   The HTTP access authentication process is described in "HTTP
   Authentication: Basic and Digest Access Authentication" [43]. User
   agents are advised to take special care in parsing the WWW-
   Authenticate field value as it might contain more than one challenge,
   or if more than one WWW-Authenticate header field is provided, the
   contents of a challenge itself can contain a comma-separated list of
   authentication parameters.

15 Security Considerations

   This section is meant to inform application developers, information
   providers, and users of the security limitations in HTTP/1.1 as
   described by this document. The discussion does not include
   definitive solutions to the problems revealed, though it does make
   some suggestions for reducing security risks.



Fielding, et al.            Standards Track                   [Page 150]

RFC 2616                        HTTP/1.1                       June 1999


15.1 Personal Information

   HTTP clients are often privy to large amounts of personal information
   (e.g. the user's name, location, mail address, passwords, encryption
   keys, etc.), and SHOULD be very careful to prevent unintentional
   leakage of this information via the HTTP protocol to other sources.
   We very strongly recommend that a convenient interface be provided
   for the user to control dissemination of such information, and that
   designers and implementors be particularly careful in this area.
   History shows that errors in this area often create serious security
   and/or privacy problems and generate highly adverse publicity for the
   implementor's company.

15.1.1 Abuse of Server Log Information

   A server is in the position to save personal data about a user's
   requests which might identify their reading patterns or subjects of
   interest. This information is clearly confidential in nature and its
   handling can be constrained by law in certain countries. People using
   the HTTP protocol to provide data are responsible for ensuring that
   such material is not distributed without the permission of any
   individuals that are identifiable by the published results.

15.1.2 Transfer of Sensitive Information

   Like any generic data transfer protocol, HTTP cannot regulate the
   content of the data that is transferred, nor is there any a priori
   method of determining the sensitivity of any particular piece of
   information within the context of any given request. Therefore,
   applications SHOULD supply as much control over this information as
   possible to the provider of that information. Four header fields are
   worth special mention in this context: Server, Via, Referer and From.

   Revealing the specific software version of the server might allow the
   server machine to become more vulnerable to attacks against software
   that is known to contain security holes. Implementors SHOULD make the
   Server header field a configurable option.

   Proxies which serve as a portal through a network firewall SHOULD
   take special precautions regarding the transfer of header information
   that identifies the hosts behind the firewall. In particular, they
   SHOULD remove, or replace with sanitized versions, any Via fields
   generated behind the firewall.

   The Referer header allows reading patterns to be studied and reverse
   links drawn. Although it can be very useful, its power can be abused
   if user details are not separated from the information contained in




Fielding, et al.            Standards Track                   [Page 151]

RFC 2616                        HTTP/1.1                       June 1999


   the Referer. Even when the personal information has been removed, the
   Referer header might indicate a private document's URI whose
   publication would be inappropriate.

   The information sent in the From field might conflict with the user's
   privacy interests or their site's security policy, and hence it
   SHOULD NOT be transmitted without the user being able to disable,
   enable, and modify the contents of the field. The user MUST be able
   to set the contents of this field within a user preference or
   application defaults configuration.

   We suggest, though do not require, that a convenient toggle interface
   be provided for the user to enable or disable the sending of From and
   Referer information.

   The User-Agent (section 14.43) or Server (section 14.38) header
   fields can sometimes be used to determine that a specific client or
   server have a particular security hole which might be exploited.
   Unfortunately, this same information is often used for other valuable
   purposes for which HTTP currently has no better mechanism.

15.1.3 Encoding Sensitive Information in URI's

   Because the source of a link might be private information or might
   reveal an otherwise private information source, it is strongly
   recommended that the user be able to select whether or not the
   Referer field is sent. For example, a browser client could have a
   toggle switch for browsing openly/anonymously, which would
   respectively enable/disable the sending of Referer and From
   information.

   Clients SHOULD NOT include a Referer header field in a (non-secure)
   HTTP request if the referring page was transferred with a secure
   protocol.

   Authors of services which use the HTTP protocol SHOULD NOT use GET
   based forms for the submission of sensitive data, because this will
   cause this data to be encoded in the Request-URI. Many existing
   servers, proxies, and user agents will log the request URI in some
   place where it might be visible to third parties. Servers can use
   POST-based form submission instead

15.1.4 Privacy Issues Connected to Accept Headers

   Accept request-headers can reveal information about the user to all
   servers which are accessed. The Accept-Language header in particular
   can reveal information the user would consider to be of a private
   nature, because the understanding of particular languages is often



Fielding, et al.            Standards Track                   [Page 152]

RFC 2616                        HTTP/1.1                       June 1999


   strongly correlated to the membership of a particular ethnic group.
   User agents which offer the option to configure the contents of an
   Accept-Language header to be sent in every request are strongly
   encouraged to let the configuration process include a message which
   makes the user aware of the loss of privacy involved.

   An approach that limits the loss of privacy would be for a user agent
   to omit the sending of Accept-Language headers by default, and to ask
   the user whether or not to start sending Accept-Language headers to a
   server if it detects, by looking for any Vary response-header fields
   generated by the server, that such sending could improve the quality
   of service.

   Elaborate user-customized accept header fields sent in every request,
   in particular if these include quality values, can be used by servers
   as relatively reliable and long-lived user identifiers. Such user
   identifiers would allow content providers to do click-trail tracking,
   and would allow collaborating content providers to match cross-server
   click-trails or form submissions of individual users. Note that for
   many users not behind a proxy, the network address of the host
   running the user agent will also serve as a long-lived user
   identifier. In environments where proxies are used to enhance
   privacy, user agents ought to be conservative in offering accept
   header configuration options to end users. As an extreme privacy
   measure, proxies could filter the accept headers in relayed requests.
   General purpose user agents which provide a high degree of header
   configurability SHOULD warn users about the loss of privacy which can
   be involved.

15.2 Attacks Based On File and Path Names

   Implementations of HTTP origin servers SHOULD be careful to restrict
   the documents returned by HTTP requests to be only those that were
   intended by the server administrators. If an HTTP server translates
   HTTP URIs directly into file system calls, the server MUST take
   special care not to serve files that were not intended to be
   delivered to HTTP clients. For example, UNIX, Microsoft Windows, and
   other operating systems use ".." as a path component to indicate a
   directory level above the current one. On such a system, an HTTP
   server MUST disallow any such construct in the Request-URI if it
   would otherwise allow access to a resource outside those intended to
   be accessible via the HTTP server. Similarly, files intended for
   reference only internally to the server (such as access control
   files, configuration files, and script code) MUST be protected from
   inappropriate retrieval, since they might contain sensitive
   information. Experience has shown that minor bugs in such HTTP server
   implementations have turned into security risks.




Fielding, et al.            Standards Track                   [Page 153]

RFC 2616                        HTTP/1.1                       June 1999


15.3 DNS Spoofing

   Clients using HTTP rely heavily on the Domain Name Service, and are
   thus generally prone to security attacks based on the deliberate
   mis-association of IP addresses and DNS names. Clients need to be
   cautious in assuming the continuing validity of an IP number/DNS name
   association.

   In particular, HTTP clients SHOULD rely on their name resolver for
   confirmation of an IP number/DNS name association, rather than
   caching the result of previous host name lookups. Many platforms
   already can cache host name lookups locally when appropriate, and
   they SHOULD be configured to do so. It is proper for these lookups to
   be cached, however, only when the TTL (Time To Live) information
   reported by the name server makes it likely that the cached
   information will remain useful.

   If HTTP clients cache the results of host name lookups in order to
   achieve a performance improvement, they MUST observe the TTL
   information reported by DNS.

   If HTTP clients do not observe this rule, they could be spoofed when
   a previously-accessed server's IP address changes. As network
   renumbering is expected to become increasingly common [24], the
   possibility of this form of attack will grow. Observing this
   requirement thus reduces this potential security vulnerability.

   This requirement also improves the load-balancing behavior of clients
   for replicated servers using the same DNS name and reduces the
   likelihood of a user's experiencing failure in accessing sites which
   use that strategy.

15.4 Location Headers and Spoofing

   If a single server supports multiple organizations that do not trust
   one another, then it MUST check the values of Location and Content-
   Location headers in responses that are generated under control of
   said organizations to make sure that they do not attempt to
   invalidate resources over which they have no authority.

15.5 Content-Disposition Issues

   RFC 1806 [35], from which the often implemented Content-Disposition
   (see section 19.5.1) header in HTTP is derived, has a number of very
   serious security considerations. Content-Disposition is not part of
   the HTTP standard, but since it is widely implemented, we are
   documenting its use and risks for implementors. See RFC 2183 [49]
   (which updates RFC 1806) for details.



Fielding, et al.            Standards Track                   [Page 154]

RFC 2616                        HTTP/1.1                       June 1999


15.6 Authentication Credentials and Idle Clients

   Existing HTTP clients and user agents typically retain authentication
   information indefinitely. HTTP/1.1. does not provide a method for a
   server to direct clients to discard these cached credentials. This is
   a significant defect that requires further extensions to HTTP.
   Circumstances under which credential caching can interfere with the
   application's security model include but are not limited to:

      - Clients which have been idle for an extended period following
        which the server might wish to cause the client to reprompt the
        user for credentials.

      - Applications which include a session termination indication
        (such as a `logout' or `commit' button on a page) after which
        the server side of the application `knows' that there is no
        further reason for the client to retain the credentials.

   This is currently under separate study. There are a number of work-
   arounds to parts of this problem, and we encourage the use of
   password protection in screen savers, idle time-outs, and other
   methods which mitigate the security problems inherent in this
   problem. In particular, user agents which cache credentials are
   encouraged to provide a readily accessible mechanism for discarding
   cached credentials under user control.

15.7 Proxies and Caching

   By their very nature, HTTP proxies are men-in-the-middle, and
   represent an opportunity for man-in-the-middle attacks. Compromise of
   the systems on which the proxies run can result in serious security
   and privacy problems. Proxies have access to security-related
   information, personal information about individual users and
   organizations, and proprietary information belonging to users and
   content providers. A compromised proxy, or a proxy implemented or
   configured without regard to security and privacy considerations,
   might be used in the commission of a wide range of potential attacks.

   Proxy operators should protect the systems on which proxies run as
   they would protect any system that contains or transports sensitive
   information. In particular, log information gathered at proxies often
   contains highly sensitive personal information, and/or information
   about organizations. Log information should be carefully guarded, and
   appropriate guidelines for use developed and followed. (Section
   15.1.1).






Fielding, et al.            Standards Track                   [Page 155]

RFC 2616                        HTTP/1.1                       June 1999


   Caching proxies provide additional potential vulnerabilities, since
   the contents of the cache represent an attractive target for
   malicious exploitation. Because cache contents persist after an HTTP
   request is complete, an attack on the cache can reveal information
   long after a user believes that the information has been removed from
   the network. Therefore, cache contents should be protected as
   sensitive information.

   Proxy implementors should consider the privacy and security
   implications of their design and coding decisions, and of the
   configuration options they provide to proxy operators (especially the
   default configuration).

   Users of a proxy need to be aware that they are no trustworthier than
   the people who run the proxy; HTTP itself cannot solve this problem.

   The judicious use of cryptography, when appropriate, may suffice to
   protect against a broad range of security and privacy attacks. Such
   cryptography is beyond the scope of the HTTP/1.1 specification.

15.7.1 Denial of Service Attacks on Proxies

   They exist. They are hard to defend against. Research continues.
   Beware.

16 Acknowledgments

   This specification makes heavy use of the augmented BNF and generic
   constructs defined by David H. Crocker for RFC 822 [9]. Similarly, it
   reuses many of the definitions provided by Nathaniel Borenstein and
   Ned Freed for MIME [7]. We hope that their inclusion in this
   specification will help reduce past confusion over the relationship
   between HTTP and Internet mail message formats.

   The HTTP protocol has evolved considerably over the years. It has
   benefited from a large and active developer community--the many
   people who have participated on the www-talk mailing list--and it is
   that community which has been most responsible for the success of
   HTTP and of the World-Wide Web in general. Marc Andreessen, Robert
   Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jean-Francois
   Groff, Phillip M. Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob
   McCool, Lou Montulli, Dave Raggett, Tony Sanders, and Marc
   VanHeyningen deserve special recognition for their efforts in
   defining early aspects of the protocol.

   This document has benefited greatly from the comments of all those
   participating in the HTTP-WG. In addition to those already mentioned,
   the following individuals have contributed to this specification:



Fielding, et al.            Standards Track                   [Page 156]

RFC 2616                        HTTP/1.1                       June 1999


       Gary Adams                  Ross Patterson
       Harald Tveit Alvestrand     Albert Lunde
       Keith Ball                  John C. Mallery
       Brian Behlendorf            Jean-Philippe Martin-Flatin
       Paul Burchard               Mitra
       Maurizio Codogno            David Morris
       Mike Cowlishaw              Gavin Nicol
       Roman Czyborra              Bill Perry
       Michael A. Dolan            Jeffrey Perry
       David J. Fiander            Scott Powers
       Alan Freier                 Owen Rees
       Marc Hedlund                Luigi Rizzo
       Greg Herlihy                David Robinson
       Koen Holtman                Marc Salomon
       Alex Hopmann                Rich Salz
       Bob Jernigan                Allan M. Schiffman
       Shel Kaphan                 Jim Seidman
       Rohit Khare                 Chuck Shotton
       John Klensin                Eric W. Sink
       Martijn Koster              Simon E. Spero
       Alexei Kosut                Richard N. Taylor
       David M. Kristol            Robert S. Thau
       Daniel LaLiberte            Bill (BearHeart) Weinman
       Ben Laurie                  Francois Yergeau
       Paul J. Leach               Mary Ellen Zurko
       Daniel DuBois               Josh Cohen


   Much of the content and presentation of the caching design is due to
   suggestions and comments from individuals including: Shel Kaphan,
   Paul Leach, Koen Holtman, David Morris, and Larry Masinter.

   Most of the specification of ranges is based on work originally done
   by Ari Luotonen and John Franks, with additional input from Steve
   Zilles.

   Thanks to the "cave men" of Palo Alto. You know who you are.

   Jim Gettys (the current editor of this document) wishes particularly
   to thank Roy Fielding, the previous editor of this document, along
   with John Klensin, Jeff Mogul, Paul Leach, Dave Kristol, Koen
   Holtman, John Franks, Josh Cohen, Alex Hopmann, Scott Lawrence, and
   Larry Masinter for their help. And thanks go particularly to Jeff
   Mogul and Scott Lawrence for performing the "MUST/MAY/SHOULD" audit.







Fielding, et al.            Standards Track                   [Page 157]

RFC 2616                        HTTP/1.1                       June 1999


   The Apache Group, Anselm Baird-Smith, author of Jigsaw, and Henrik
   Frystyk implemented RFC 2068 early, and we wish to thank them for the
   discovery of many of the problems that this document attempts to
   rectify.

17 References

   [1] Alvestrand, H., "Tags for the Identification of Languages", RFC
       1766, March 1995.

   [2] Anklesaria, F., McCahill, M., Lindner, P., Johnson, D., Torrey,
       D. and B. Alberti, "The Internet Gopher Protocol (a distributed
       document search and retrieval protocol)", RFC 1436, March 1993.

   [3] Berners-Lee, T., "Universal Resource Identifiers in WWW", RFC
       1630, June 1994.

   [4] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource
       Locators (URL)", RFC 1738, December 1994.

   [5] Berners-Lee, T. and D. Connolly, "Hypertext Markup Language -
       2.0", RFC 1866, November 1995.

   [6] Berners-Lee, T., Fielding, R. and H. Frystyk, "Hypertext Transfer
       Protocol -- HTTP/1.0", RFC 1945, May 1996.

   [7] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
       Extensions (MIME) Part One: Format of Internet Message Bodies",
       RFC 2045, November 1996.

   [8] Braden, R., "Requirements for Internet Hosts -- Communication
       Layers", STD 3, RFC 1123, October 1989.

   [9] Crocker, D., "Standard for The Format of ARPA Internet Text
       Messages", STD 11, RFC 822, August 1982.

   [10] Davis, F., Kahle, B., Morris, H., Salem, J., Shen, T., Wang, R.,
        Sui, J., and M. Grinbaum, "WAIS Interface Protocol Prototype
        Functional Specification," (v1.5), Thinking Machines
        Corporation, April 1990.

   [11] Fielding, R., "Relative Uniform Resource Locators", RFC 1808,
        June 1995.

   [12] Horton, M. and R. Adams, "Standard for Interchange of USENET
        Messages", RFC 1036, December 1987.





Fielding, et al.            Standards Track                   [Page 158]

RFC 2616                        HTTP/1.1                       June 1999


   [13] Kantor, B. and P. Lapsley, "Network News Transfer Protocol", RFC
        977, February 1986.

   [14] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
        Three: Message Header Extensions for Non-ASCII Text", RFC 2047,
        November 1996.

   [15] Nebel, E. and L. Masinter, "Form-based File Upload in HTML", RFC
        1867, November 1995.

   [16] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
        August 1982.

   [17] Postel, J., "Media Type Registration Procedure", RFC 1590,
        November 1996.

   [18] Postel, J. and J. Reynolds, "File Transfer Protocol", STD 9, RFC
        959, October 1985.

   [19] Reynolds, J. and J. Postel, "Assigned Numbers", STD 2, RFC 1700,
        October 1994.

   [20] Sollins, K. and L. Masinter, "Functional Requirements for
        Uniform Resource Names", RFC 1737, December 1994.

   [21] US-ASCII. Coded Character Set - 7-Bit American Standard Code for
        Information Interchange. Standard ANSI X3.4-1986, ANSI, 1986.

   [22] ISO-8859. International Standard -- Information Processing --
        8-bit Single-Byte Coded Graphic Character Sets --
        Part 1: Latin alphabet No. 1, ISO-8859-1:1987.
        Part 2: Latin alphabet No. 2, ISO-8859-2, 1987.
        Part 3: Latin alphabet No. 3, ISO-8859-3, 1988.
        Part 4: Latin alphabet No. 4, ISO-8859-4, 1988.
        Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988.
        Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987.
        Part 7: Latin/Greek alphabet, ISO-8859-7, 1987.
        Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988.
        Part 9: Latin alphabet No. 5, ISO-8859-9, 1990.

   [23] Meyers, J. and M. Rose, "The Content-MD5 Header Field", RFC
        1864, October 1995.

   [24] Carpenter, B. and Y. Rekhter, "Renumbering Needs Work", RFC
        1900, February 1996.

   [25] Deutsch, P., "GZIP file format specification version 4.3", RFC
        1952, May 1996.



Fielding, et al.            Standards Track                   [Page 159]

RFC 2616                        HTTP/1.1                       June 1999


   [26] Venkata N. Padmanabhan, and Jeffrey C. Mogul. "Improving HTTP
        Latency", Computer Networks and ISDN Systems, v. 28, pp. 25-35,
        Dec. 1995. Slightly revised version of paper in Proc. 2nd
        International WWW Conference '94: Mosaic and the Web, Oct. 1994,
        which is available at
        http://www.ncsa.uiuc.edu/SDG/IT94/Proceedings/DDay/mogul/HTTPLat
        ency.html.

   [27] Joe Touch, John Heidemann, and Katia Obraczka. "Analysis of HTTP
        Performance", <URL: http://www.isi.edu/touch/pubs/http-perf96/>,
        ISI Research Report ISI/RR-98-463, (original report dated Aug.
        1996), USC/Information Sciences Institute, August 1998.

   [28] Mills, D., "Network Time Protocol (Version 3) Specification,
        Implementation and Analysis", RFC 1305, March 1992.

   [29] Deutsch, P., "DEFLATE Compressed Data Format Specification
        version 1.3", RFC 1951, May 1996.

   [30] S. Spero, "Analysis of HTTP Performance Problems,"
        http://sunsite.unc.edu/mdma-release/http-prob.html.

   [31] Deutsch, P. and J. Gailly, "ZLIB Compressed Data Format
        Specification version 3.3", RFC 1950, May 1996.

   [32] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
        Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP:
        Digest Access Authentication", RFC 2069, January 1997.

   [33] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T.
        Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC
        2068, January 1997.

   [34] Bradner, S., "Key words for use in RFCs to Indicate Requirement
        Levels", BCP 14, RFC 2119, March 1997.

   [35] Troost, R. and Dorner, S., "Communicating Presentation
        Information in Internet Messages: The Content-Disposition
        Header", RFC 1806, June 1995.

   [36] Mogul, J., Fielding, R., Gettys, J. and H. Frystyk, "Use and
        Interpretation of HTTP Version Numbers", RFC 2145, May 1997.
        [jg639]

   [37] Palme, J., "Common Internet Message Headers", RFC 2076, February
        1997. [jg640]





Fielding, et al.            Standards Track                   [Page 160]

RFC 2616                        HTTP/1.1                       June 1999


   [38] Yergeau, F., "UTF-8, a transformation format of Unicode and
        ISO-10646", RFC 2279, January 1998. [jg641]

   [39] Nielsen, H.F., Gettys, J., Baird-Smith, A., Prud'hommeaux, E.,
        Lie, H., and C. Lilley. "Network Performance Effects of
        HTTP/1.1, CSS1, and PNG," Proceedings of ACM SIGCOMM '97, Cannes
        France, September 1997.[jg642]

   [40] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
        Extensions (MIME) Part Two: Media Types", RFC 2046, November
        1996. [jg643]

   [41] Alvestrand, H., "IETF Policy on Character Sets and Languages",
        BCP 18, RFC 2277, January 1998. [jg644]

   [42] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource
        Identifiers (URI): Generic Syntax and Semantics", RFC 2396,
        August 1998. [jg645]

   [43] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
        Leach, P., Luotonen, A., Sink, E. and L. Stewart, "HTTP
        Authentication: Basic and Digest Access Authentication", RFC
        2617, June 1999. [jg646]

   [44] Luotonen, A., "Tunneling TCP based protocols through Web proxy
        servers," Work in Progress. [jg647]

   [45] Palme, J. and A. Hopmann, "MIME E-mail Encapsulation of
        Aggregate Documents, such as HTML (MHTML)", RFC 2110, March
        1997.

   [46] Bradner, S., "The Internet Standards Process -- Revision 3", BCP
        9, RFC 2026, October 1996.

   [47] Masinter, L., "Hyper Text Coffee Pot Control Protocol
        (HTCPCP/1.0)", RFC 2324, 1 April 1998.

   [48] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
        Extensions (MIME) Part Five: Conformance Criteria and Examples",
        RFC 2049, November 1996.

   [49] Troost, R., Dorner, S. and K. Moore, "Communicating Presentation
        Information in Internet Messages: The Content-Disposition Header
        Field", RFC 2183, August 1997.







Fielding, et al.            Standards Track                   [Page 161]

RFC 2616                        HTTP/1.1                       June 1999


18 Authors' Addresses

   Roy T. Fielding
   Information and Computer Science
   University of California, Irvine
   Irvine, CA 92697-3425, USA

   Fax: +1 (949) 824-1715
   EMail: fielding@ics.uci.edu


   James Gettys
   World Wide Web Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, USA

   Fax: +1 (617) 258 8682
   EMail: jg@w3.org


   Jeffrey C. Mogul
   Western Research Laboratory
   Compaq Computer Corporation
   250 University Avenue
   Palo Alto, California, 94305, USA

   EMail: mogul@wrl.dec.com


   Henrik Frystyk Nielsen
   World Wide Web Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, USA

   Fax: +1 (617) 258 8682
   EMail: frystyk@w3.org


   Larry Masinter
   Xerox Corporation
   3333 Coyote Hill Road
   Palo Alto, CA 94034, USA

   EMail: masinter@parc.xerox.com





Fielding, et al.            Standards Track                   [Page 162]

RFC 2616                        HTTP/1.1                       June 1999


   Paul J. Leach
   Microsoft Corporation
   1 Microsoft Way
   Redmond, WA 98052, USA

   EMail: paulle@microsoft.com


   Tim Berners-Lee
   Director, World Wide Web Consortium
   MIT Laboratory for Computer Science
   545 Technology Square
   Cambridge, MA 02139, USA

   Fax: +1 (617) 258 8682
   EMail: timbl@w3.org



































Fielding, et al.            Standards Track                   [Page 163]

RFC 2616                        HTTP/1.1                       June 1999


19 Appendices

19.1 Internet Media Type message/http and application/http

   In addition to defining the HTTP/1.1 protocol, this document serves
   as the specification for the Internet media type "message/http" and
   "application/http". The message/http type can be used to enclose a
   single HTTP request or response message, provided that it obeys the
   MIME restrictions for all "message" types regarding line length and
   encodings. The application/http type can be used to enclose a
   pipeline of one or more HTTP request or response messages (not
   intermixed). The following is to be registered with IANA [17].

       Media Type name:         message
       Media subtype name:      http
       Required parameters:     none
       Optional parameters:     version, msgtype
        version: The HTTP-Version number of the enclosed message
                 (e.g., "1.1"). If not present, the version can be
                 determined from the first line of the body.
        msgtype: The message type -- "request" or "response". If not
                 present, the type can be determined from the first
                 line of the body.
       Encoding considerations: only "7bit", "8bit", or "binary" are
                                permitted
       Security considerations: none

       Media Type name:         application
       Media subtype name:      http
       Required parameters:     none
       Optional parameters:     version, msgtype
        version: The HTTP-Version number of the enclosed messages
                 (e.g., "1.1"). If not present, the version can be
                 determined from the first line of the body.
        msgtype: The message type -- "request" or "response". If not
                 present, the type can be determined from the first
                 line of the body.
       Encoding considerations: HTTP messages enclosed by this type
                 are in "binary" format; use of an appropriate
                 Content-Transfer-Encoding is required when
                 transmitted via E-mail.
       Security considerations: none









Fielding, et al.            Standards Track                   [Page 164]

RFC 2616                        HTTP/1.1                       June 1999


19.2 Internet Media Type multipart/byteranges

   When an HTTP 206 (Partial Content) response message includes the
   content of multiple ranges (a response to a request for multiple
   non-overlapping ranges), these are transmitted as a multipart
   message-body. The media type for this purpose is called
   "multipart/byteranges".

   The multipart/byteranges media type includes two or more parts, each
   with its own Content-Type and Content-Range fields. The required
   boundary parameter specifies the boundary string used to separate
   each body-part.

       Media Type name:         multipart
       Media subtype name:      byteranges
       Required parameters:     boundary
       Optional parameters:     none
       Encoding considerations: only "7bit", "8bit", or "binary" are
                                permitted
       Security considerations: none


   For example:

   HTTP/1.1 206 Partial Content
   Date: Wed, 15 Nov 1995 06:25:24 GMT
   Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
   Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

   --THIS_STRING_SEPARATES
   Content-type: application/pdf
   Content-range: bytes 500-999/8000

   ...the first range...
   --THIS_STRING_SEPARATES
   Content-type: application/pdf
   Content-range: bytes 7000-7999/8000

   ...the second range
   --THIS_STRING_SEPARATES--

      Notes:

      1) Additional CRLFs may precede the first boundary string in the
         entity.






Fielding, et al.            Standards Track                   [Page 165]

RFC 2616                        HTTP/1.1                       June 1999


      2) Although RFC 2046 [40] permits the boundary string to be
         quoted, some existing implementations handle a quoted boundary
         string incorrectly.

      3) A number of browsers and servers were coded to an early draft
         of the byteranges specification to use a media type of
         multipart/x-byteranges, which is almost, but not quite
         compatible with the version documented in HTTP/1.1.

19.3 Tolerant Applications

   Although this document specifies the requirements for the generation
   of HTTP/1.1 messages, not all applications will be correct in their
   implementation. We therefore recommend that operational applications
   be tolerant of deviations whenever those deviations can be
   interpreted unambiguously.

   Clients SHOULD be tolerant in parsing the Status-Line and servers
   tolerant when parsing the Request-Line. In particular, they SHOULD
   accept any amount of SP or HT characters between fields, even though
   only a single SP is required.

   The line terminator for message-header fields is the sequence CRLF.
   However, we recommend that applications, when parsing such headers,
   recognize a single LF as a line terminator and ignore the leading CR.

   The character set of an entity-body SHOULD be labeled as the lowest
   common denominator of the character codes used within that body, with
   the exception that not labeling the entity is preferred over labeling
   the entity with the labels US-ASCII or ISO-8859-1. See section 3.7.1
   and 3.4.1.

   Additional rules for requirements on parsing and encoding of dates
   and other potential problems with date encodings include:

      - HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date
        which appears to be more than 50 years in the future is in fact
        in the past (this helps solve the "year 2000" problem).

      - An HTTP/1.1 implementation MAY internally represent a parsed
        Expires date as earlier than the proper value, but MUST NOT
        internally represent a parsed Expires date as later than the
        proper value.

      - All expiration-related calculations MUST be done in GMT. The
        local time zone MUST NOT influence the calculation or comparison
        of an age or expiration time.




Fielding, et al.            Standards Track                   [Page 166]

RFC 2616                        HTTP/1.1                       June 1999


      - If an HTTP header incorrectly carries a date value with a time
        zone other than GMT, it MUST be converted into GMT using the
        most conservative possible conversion.

19.4 Differences Between HTTP Entities and RFC 2045 Entities

   HTTP/1.1 uses many of the constructs defined for Internet Mail (RFC
   822 [9]) and the Multipurpose Internet Mail Extensions (MIME [7]) to
   allow entities to be transmitted in an open variety of
   representations and with extensible mechanisms. However, RFC 2045
   discusses mail, and HTTP has a few features that are different from
   those described in RFC 2045. These differences were carefully chosen
   to optimize performance over binary connections, to allow greater
   freedom in the use of new media types, to make date comparisons
   easier, and to acknowledge the practice of some early HTTP servers
   and clients.

   This appendix describes specific areas where HTTP differs from RFC
   2045. Proxies and gateways to strict MIME environments SHOULD be
   aware of these differences and provide the appropriate conversions
   where necessary. Proxies and gateways from MIME environments to HTTP
   also need to be aware of the differences because some conversions
   might be required.

19.4.1 MIME-Version

   HTTP is not a MIME-compliant protocol. However, HTTP/1.1 messages MAY
   include a single MIME-Version general-header field to indicate what
   version of the MIME protocol was used to construct the message. Use
   of the MIME-Version header field indicates that the message is in
   full compliance with the MIME protocol (as defined in RFC 2045[7]).
   Proxies/gateways are responsible for ensuring full compliance (where
   possible) when exporting HTTP messages to strict MIME environments.

       MIME-Version   = "MIME-Version" ":" 1*DIGIT "." 1*DIGIT

   MIME version "1.0" is the default for use in HTTP/1.1. However,
   HTTP/1.1 message parsing and semantics are defined by this document
   and not the MIME specification.

19.4.2 Conversion to Canonical Form

   RFC 2045 [7] requires that an Internet mail entity be converted to
   canonical form prior to being transferred, as described in section 4
   of RFC 2049 [48]. Section 3.7.1 of this document describes the forms
   allowed for subtypes of the "text" media type when transmitted over
   HTTP. RFC 2046 requires that content with a type of "text" represent
   line breaks as CRLF and forbids the use of CR or LF outside of line



Fielding, et al.            Standards Track                   [Page 167]

RFC 2616                        HTTP/1.1                       June 1999


   break sequences. HTTP allows CRLF, bare CR, and bare LF to indicate a
   line break within text content when a message is transmitted over
   HTTP.

   Where it is possible, a proxy or gateway from HTTP to a strict MIME
   environment SHOULD translate all line breaks within the text media
   types described in section 3.7.1 of this document to the RFC 2049
   canonical form of CRLF. Note, however, that this might be complicated
   by the presence of a Content-Encoding and by the fact that HTTP
   allows the use of some character sets which do not use octets 13 and
   10 to represent CR and LF, as is the case for some multi-byte
   character sets.

   Implementors should note that conversion will break any cryptographic
   checksums applied to the original content unless the original content
   is already in canonical form. Therefore, the canonical form is
   recommended for any content that uses such checksums in HTTP.

19.4.3 Conversion of Date Formats

   HTTP/1.1 uses a restricted set of date formats (section 3.3.1) to
   simplify the process of date comparison. Proxies and gateways from
   other protocols SHOULD ensure that any Date header field present in a
   message conforms to one of the HTTP/1.1 formats and rewrite the date
   if necessary.

19.4.4 Introduction of Content-Encoding

   RFC 2045 does not include any concept equivalent to HTTP/1.1's
   Content-Encoding header field. Since this acts as a modifier on the
   media type, proxies and gateways from HTTP to MIME-compliant
   protocols MUST either change the value of the Content-Type header
   field or decode the entity-body before forwarding the message. (Some
   experimental applications of Content-Type for Internet mail have used
   a media-type parameter of ";conversions=<content-coding>" to perform
   a function equivalent to Content-Encoding. However, this parameter is
   not part of RFC 2045.)

19.4.5 No Content-Transfer-Encoding

   HTTP does not use the Content-Transfer-Encoding (CTE) field of RFC
   2045. Proxies and gateways from MIME-compliant protocols to HTTP MUST
   remove any non-identity CTE ("quoted-printable" or "base64") encoding
   prior to delivering the response message to an HTTP client.

   Proxies and gateways from HTTP to MIME-compliant protocols are
   responsible for ensuring that the message is in the correct format
   and encoding for safe transport on that protocol, where "safe



Fielding, et al.            Standards Track                   [Page 168]

RFC 2616                        HTTP/1.1                       June 1999


   transport" is defined by the limitations of the protocol being used.
   Such a proxy or gateway SHOULD label the data with an appropriate
   Content-Transfer-Encoding if doing so will improve the likelihood of
   safe transport over the destination protocol.

19.4.6 Introduction of Transfer-Encoding

   HTTP/1.1 introduces the Transfer-Encoding header field (section
   14.41). Proxies/gateways MUST remove any transfer-coding prior to
   forwarding a message via a MIME-compliant protocol.

   A process for decoding the "chunked" transfer-coding (section 3.6)
   can be represented in pseudo-code as:

       length := 0
       read chunk-size, chunk-extension (if any) and CRLF
       while (chunk-size > 0) {
          read chunk-data and CRLF
          append chunk-data to entity-body
          length := length + chunk-size
          read chunk-size and CRLF
       }
       read entity-header
       while (entity-header not empty) {
          append entity-header to existing header fields
          read entity-header
       }
       Content-Length := length
       Remove "chunked" from Transfer-Encoding

19.4.7 MHTML and Line Length Limitations

   HTTP implementations which share code with MHTML [45] implementations
   need to be aware of MIME line length limitations. Since HTTP does not
   have this limitation, HTTP does not fold long lines. MHTML messages
   being transported by HTTP follow all conventions of MHTML, including
   line length limitations and folding, canonicalization, etc., since
   HTTP transports all message-bodies as payload (see section 3.7.2) and
   does not interpret the content or any MIME header lines that might be
   contained therein.

19.5 Additional Features

   RFC 1945 and RFC 2068 document protocol elements used by some
   existing HTTP implementations, but not consistently and correctly
   across most HTTP/1.1 applications. Implementors are advised to be
   aware of these features, but cannot rely upon their presence in, or
   interoperability with, other HTTP/1.1 applications. Some of these



Fielding, et al.            Standards Track                   [Page 169]

RFC 2616                        HTTP/1.1                       June 1999


   describe proposed experimental features, and some describe features
   that experimental deployment found lacking that are now addressed in
   the base HTTP/1.1 specification.

   A number of other headers, such as Content-Disposition and Title,
   from SMTP and MIME are also often implemented (see RFC 2076 [37]).

19.5.1 Content-Disposition

   The Content-Disposition response-header field has been proposed as a
   means for the origin server to suggest a default filename if the user
   requests that the content is saved to a file. This usage is derived
   from the definition of Content-Disposition in RFC 1806 [35].

        content-disposition = "Content-Disposition" ":"
                              disposition-type *( ";" disposition-parm )
        disposition-type = "attachment" | disp-extension-token
        disposition-parm = filename-parm | disp-extension-parm
        filename-parm = "filename" "=" quoted-string
        disp-extension-token = token
        disp-extension-parm = token "=" ( token | quoted-string )

   An example is

        Content-Disposition: attachment; filename="fname.ext"

   The receiving user agent SHOULD NOT respect any directory path
   information present in the filename-parm parameter, which is the only
   parameter believed to apply to HTTP implementations at this time. The
   filename SHOULD be treated as a terminal component only.

   If this header is used in a response with the application/octet-
   stream content-type, the implied suggestion is that the user agent
   should not display the response, but directly enter a `save response
   as...' dialog.

   See section 15.5 for Content-Disposition security issues.

19.6 Compatibility with Previous Versions

   It is beyond the scope of a protocol specification to mandate
   compliance with previous versions. HTTP/1.1 was deliberately
   designed, however, to make supporting previous versions easy. It is
   worth noting that, at the time of composing this specification
   (1996), we would expect commercial HTTP/1.1 servers to:

      - recognize the format of the Request-Line for HTTP/0.9, 1.0, and
        1.1 requests;



Fielding, et al.            Standards Track                   [Page 170]

RFC 2616                        HTTP/1.1                       June 1999


      - understand any valid request in the format of HTTP/0.9, 1.0, or
        1.1;

      - respond appropriately with a message in the same major version
        used by the client.

   And we would expect HTTP/1.1 clients to:

      - recognize the format of the Status-Line for HTTP/1.0 and 1.1
        responses;

      - understand any valid response in the format of HTTP/0.9, 1.0, or
        1.1.

   For most implementations of HTTP/1.0, each connection is established
   by the client prior to the request and closed by the server after
   sending the response. Some implementations implement the Keep-Alive
   version of persistent connections described in section 19.7.1 of RFC
   2068 [33].

19.6.1 Changes from HTTP/1.0

   This section summarizes major differences between versions HTTP/1.0
   and HTTP/1.1.

19.6.1.1 Changes to Simplify Multi-homed Web Servers and Conserve IP
         Addresses

   The requirements that clients and servers support the Host request-
   header, report an error if the Host request-header (section 14.23) is
   missing from an HTTP/1.1 request, and accept absolute URIs (section
   5.1.2) are among the most important changes defined by this
   specification.

   Older HTTP/1.0 clients assumed a one-to-one relationship of IP
   addresses and servers; there was no other established mechanism for
   distinguishing the intended server of a request than the IP address
   to which that request was directed. The changes outlined above will
   allow the Internet, once older HTTP clients are no longer common, to
   support multiple Web sites from a single IP address, greatly
   simplifying large operational Web servers, where allocation of many
   IP addresses to a single host has created serious problems. The
   Internet will also be able to recover the IP addresses that have been
   allocated for the sole purpose of allowing special-purpose domain
   names to be used in root-level HTTP URLs. Given the rate of growth of
   the Web, and the number of servers already deployed, it is extremely





Fielding, et al.            Standards Track                   [Page 171]

RFC 2616                        HTTP/1.1                       June 1999


   important that all implementations of HTTP (including updates to
   existing HTTP/1.0 applications) correctly implement these
   requirements:

      - Both clients and servers MUST support the Host request-header.

      - A client that sends an HTTP/1.1 request MUST send a Host header.

      - Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
        request does not include a Host request-header.

      - Servers MUST accept absolute URIs.

19.6.2 Compatibility with HTTP/1.0 Persistent Connections

   Some clients and servers might wish to be compatible with some
   previous implementations of persistent connections in HTTP/1.0
   clients and servers. Persistent connections in HTTP/1.0 are
   explicitly negotiated as they are not the default behavior. HTTP/1.0
   experimental implementations of persistent connections are faulty,
   and the new facilities in HTTP/1.1 are designed to rectify these
   problems. The problem was that some existing 1.0 clients may be
   sending Keep-Alive to a proxy server that doesn't understand
   Connection, which would then erroneously forward it to the next
   inbound server, which would establish the Keep-Alive connection and
   result in a hung HTTP/1.0 proxy waiting for the close on the
   response. The result is that HTTP/1.0 clients must be prevented from
   using Keep-Alive when talking to proxies.

   However, talking to proxies is the most important use of persistent
   connections, so that prohibition is clearly unacceptable. Therefore,
   we need some other mechanism for indicating a persistent connection
   is desired, which is safe to use even when talking to an old proxy
   that ignores Connection. Persistent connections are the default for
   HTTP/1.1 messages; we introduce a new keyword (Connection: close) for
   declaring non-persistence. See section 14.10.

   The original HTTP/1.0 form of persistent connections (the Connection:
   Keep-Alive and Keep-Alive header) is documented in RFC 2068. [33]

19.6.3 Changes from RFC 2068

   This specification has been carefully audited to correct and
   disambiguate key word usage; RFC 2068 had many problems in respect to
   the conventions laid out in RFC 2119 [34].

   Clarified which error code should be used for inbound server failures
   (e.g. DNS failures). (Section 10.5.5).



Fielding, et al.            Standards Track                   [Page 172]

RFC 2616                        HTTP/1.1                       June 1999


   CREATE had a race that required an Etag be sent when a resource is
   first created. (Section 10.2.2).

   Content-Base was deleted from the specification: it was not
   implemented widely, and there is no simple, safe way to introduce it
   without a robust extension mechanism. In addition, it is used in a
   similar, but not identical fashion in MHTML [45].

   Transfer-coding and message lengths all interact in ways that
   required fixing exactly when chunked encoding is used (to allow for
   transfer encoding that may not be self delimiting); it was important
   to straighten out exactly how message lengths are computed. (Sections
   3.6, 4.4, 7.2.2, 13.5.2, 14.13, 14.16)

   A content-coding of "identity" was introduced, to solve problems
   discovered in caching. (section 3.5)

   Quality Values of zero should indicate that "I don't want something"
   to allow clients to refuse a representation. (Section 3.9)

   The use and interpretation of HTTP version numbers has been clarified
   by RFC 2145. Require proxies to upgrade requests to highest protocol
   version they support to deal with problems discovered in HTTP/1.0
   implementations (Section 3.1)

   Charset wildcarding is introduced to avoid explosion of character set
   names in accept headers. (Section 14.2)

   A case was missed in the Cache-Control model of HTTP/1.1; s-maxage
   was introduced to add this missing case. (Sections 13.4, 14.8, 14.9,
   14.9.3)

   The Cache-Control: max-age directive was not properly defined for
   responses. (Section 14.9.3)

   There are situations where a server (especially a proxy) does not
   know the full length of a response but is capable of serving a
   byterange request. We therefore need a mechanism to allow byteranges
   with a content-range not indicating the full length of the message.
   (Section 14.16)

   Range request responses would become very verbose if all meta-data
   were always returned; by allowing the server to only send needed
   headers in a 206 response, this problem can be avoided. (Section
   10.2.7, 13.5.3, and 14.27)






Fielding, et al.            Standards Track                   [Page 173]

RFC 2616                        HTTP/1.1                       June 1999


   Fix problem with unsatisfiable range requests; there are two cases:
   syntactic problems, and range doesn't exist in the document. The 416
   status code was needed to resolve this ambiguity needed to indicate
   an error for a byte range request that falls outside of the actual
   contents of a document. (Section 10.4.17, 14.16)

   Rewrite of message transmission requirements to make it much harder
   for implementors to get it wrong, as the consequences of errors here
   can have significant impact on the Internet, and to deal with the
   following problems:

      1. Changing "HTTP/1.1 or later" to "HTTP/1.1", in contexts where
         this was incorrectly placing a requirement on the behavior of
         an implementation of a future version of HTTP/1.x

      2. Made it clear that user-agents should retry requests, not
         "clients" in general.

      3. Converted requirements for clients to ignore unexpected 100
         (Continue) responses, and for proxies to forward 100 responses,
         into a general requirement for 1xx responses.

      4. Modified some TCP-specific language, to make it clearer that
         non-TCP transports are possible for HTTP.

      5. Require that the origin server MUST NOT wait for the request
         body before it sends a required 100 (Continue) response.

      6. Allow, rather than require, a server to omit 100 (Continue) if
         it has already seen some of the request body.

      7. Allow servers to defend against denial-of-service attacks and
         broken clients.

   This change adds the Expect header and 417 status code. The message
   transmission requirements fixes are in sections 8.2, 10.4.18,
   8.1.2.2, 13.11, and 14.20.

   Proxies should be able to add Content-Length when appropriate.
   (Section 13.5.2)

   Clean up confusion between 403 and 404 responses. (Section 10.4.4,
   10.4.5, and 10.4.11)

   Warnings could be cached incorrectly, or not updated appropriately.
   (Section 13.1.2, 13.2.4, 13.5.2, 13.5.3, 14.9.3, and 14.46) Warning
   also needed to be a general header, as PUT or other methods may have
   need for it in requests.



Fielding, et al.            Standards Track                   [Page 174]

RFC 2616                        HTTP/1.1                       June 1999


   Transfer-coding had significant problems, particularly with
   interactions with chunked encoding. The solution is that transfer-
   codings become as full fledged as content-codings. This involves
   adding an IANA registry for transfer-codings (separate from content
   codings), a new header field (TE) and enabling trailer headers in the
   future. Transfer encoding is a major performance benefit, so it was
   worth fixing [39]. TE also solves another, obscure, downward
   interoperability problem that could have occurred due to interactions
   between authentication trailers, chunked encoding and HTTP/1.0
   clients.(Section 3.6, 3.6.1, and 14.39)

   The PATCH, LINK, UNLINK methods were defined but not commonly
   implemented in previous versions of this specification. See RFC 2068
   [33].

   The Alternates, Content-Version, Derived-From, Link, URI, Public and
   Content-Base header fields were defined in previous versions of this
   specification, but not commonly implemented. See RFC 2068 [33].

20 Index

   Please see the PostScript version of this RFC for the INDEX.





























Fielding, et al.            Standards Track                   [Page 175]

RFC 2616                        HTTP/1.1                       June 1999


21.  Full Copyright Statement

   Copyright (C) The Internet Society (1999).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Fielding, et al.            Standards Track                   [Page 176]


Added doc/rfc2617.txt.




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                          J. Franks
Request for Comments: 2617                       Northwestern University
Obsoletes: 2069                                          P. Hallam-Baker
Category: Standards Track                                 Verisign, Inc.
                                                            J. Hostetler
                                                         AbiSource, Inc.
                                                             S. Lawrence
                                                   Agranat Systems, Inc.
                                                                P. Leach
                                                   Microsoft Corporation
                                                             A. Luotonen
                                     Netscape Communications Corporation
                                                              L. Stewart
                                                       Open Market, Inc.
                                                               June 1999


      HTTP Authentication: Basic and Digest Access Authentication

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (1999).  All Rights Reserved.

Abstract

   "HTTP/1.0", includes the specification for a Basic Access
   Authentication scheme. This scheme is not considered to be a secure
   method of user authentication (unless used in conjunction with some
   external secure system such as SSL [5]), as the user name and
   password are passed over the network as cleartext.

   This document also provides the specification for HTTP's
   authentication framework, the original Basic authentication scheme
   and a scheme based on cryptographic hashes, referred to as "Digest
   Access Authentication".  It is therefore also intended to serve as a
   replacement for RFC 2069 [6].  Some optional elements specified by
   RFC 2069 have been removed from this specification due to problems
   found since its publication; other new elements have been added for
   compatibility, those new elements have been made optional, but are
   strongly recommended.



Franks, et al.              Standards Track                     [Page 1]

RFC 2617                  HTTP Authentication                  June 1999


   Like Basic, Digest access authentication verifies that both parties
   to a communication know a shared secret (a password); unlike Basic,
   this verification can be done without sending the password in the
   clear, which is Basic's biggest weakness. As with most other
   authentication protocols, the greatest sources of risks are usually
   found not in the core protocol itself but in policies and procedures
   surrounding its use.

Table of Contents

   1   Access Authentication................................   3
    1.1   Reliance on the HTTP/1.1 Specification............   3
    1.2   Access Authentication Framework...................   3
   2   Basic Authentication Scheme..........................   5
   3   Digest Access Authentication Scheme..................   6
    3.1   Introduction......................................   6
     3.1.1  Purpose.........................................   6
     3.1.2  Overall Operation...............................   6
     3.1.3  Representation of digest values.................   7
     3.1.4  Limitations.....................................   7
    3.2   Specification of Digest Headers...................   7
     3.2.1  The WWW-Authenticate Response Header............   8
     3.2.2  The Authorization Request Header................  11
     3.2.3  The Authentication-Info Header..................  15
    3.3   Digest Operation..................................  17
    3.4   Security Protocol Negotiation.....................  18
    3.5   Example...........................................  18
    3.6   Proxy-Authentication and Proxy-Authorization......  19
   4   Security Considerations..............................  19
    4.1   Authentication of Clients using Basic
          Authentication....................................  19
    4.2   Authentication of Clients using Digest
          Authentication....................................  20
    4.3   Limited Use Nonce Values..........................  21
    4.4   Comparison of Digest with Basic Authentication....  22
    4.5   Replay Attacks....................................  22
    4.6   Weakness Created by Multiple Authentication
          Schemes...........................................  23
    4.7   Online dictionary attacks.........................  23
    4.8   Man in the Middle.................................  24
    4.9   Chosen plaintext attacks..........................  24
    4.10  Precomputed dictionary attacks....................  25
    4.11  Batch brute force attacks.........................  25
    4.12  Spoofing by Counterfeit Servers...................  25
    4.13  Storing passwords.................................  26
    4.14  Summary...........................................  26
   5   Sample implementation................................  27
   6   Acknowledgments......................................  31



Franks, et al.              Standards Track                     [Page 2]

RFC 2617                  HTTP Authentication                  June 1999


   7   References...........................................  31
   8   Authors' Addresses...................................  32
   9   Full Copyright Statement.............................  34

1 Access Authentication

1.1 Reliance on the HTTP/1.1 Specification

   This specification is a companion to the HTTP/1.1 specification [2].
   It uses the augmented BNF section 2.1 of that document, and relies on
   both the non-terminals defined in that document and other aspects of
   the HTTP/1.1 specification.

1.2 Access Authentication Framework

   HTTP provides a simple challenge-response authentication mechanism
   that MAY be used by a server to challenge a client request and by a
   client to provide authentication information. It uses an extensible,
   case-insensitive token to identify the authentication scheme,
   followed by a comma-separated list of attribute-value pairs which
   carry the parameters necessary for achieving authentication via that
   scheme.

      auth-scheme    = token
      auth-param     = token "=" ( token | quoted-string )

   The 401 (Unauthorized) response message is used by an origin server
   to challenge the authorization of a user agent. This response MUST
   include a WWW-Authenticate header field containing at least one
   challenge applicable to the requested resource. The 407 (Proxy
   Authentication Required) response message is used by a proxy to
   challenge the authorization of a client and MUST include a Proxy-
   Authenticate header field containing at least one challenge
   applicable to the proxy for the requested resource.

      challenge   = auth-scheme 1*SP 1#auth-param

   Note: User agents will need to take special care in parsing the WWW-
   Authenticate or Proxy-Authenticate header field value if it contains
   more than one challenge, or if more than one WWW-Authenticate header
   field is provided, since the contents of a challenge may itself
   contain a comma-separated list of authentication parameters.

   The authentication parameter realm is defined for all authentication
   schemes:

      realm       = "realm" "=" realm-value
      realm-value = quoted-string



Franks, et al.              Standards Track                     [Page 3]

RFC 2617                  HTTP Authentication                  June 1999


   The realm directive (case-insensitive) is required for all
   authentication schemes that issue a challenge. The realm value
   (case-sensitive), in combination with the canonical root URL (the
   absoluteURI for the server whose abs_path is empty; see section 5.1.2
   of [2]) of the server being accessed, defines the protection space.
   These realms allow the protected resources on a server to be
   partitioned into a set of protection spaces, each with its own
   authentication scheme and/or authorization database. The realm value
   is a string, generally assigned by the origin server, which may have
   additional semantics specific to the authentication scheme. Note that
   there may be multiple challenges with the same auth-scheme but
   different realms.

   A user agent that wishes to authenticate itself with an origin
   server--usually, but not necessarily, after receiving a 401
   (Unauthorized)--MAY do so by including an Authorization header field
   with the request. A client that wishes to authenticate itself with a
   proxy--usually, but not necessarily, after receiving a 407 (Proxy
   Authentication Required)--MAY do so by including a Proxy-
   Authorization header field with the request.  Both the Authorization
   field value and the Proxy-Authorization field value consist of
   credentials containing the authentication information of the client
   for the realm of the resource being requested. The user agent MUST
   choose to use one of the challenges with the strongest auth-scheme it
   understands and request credentials from the user based upon that
   challenge.

   credentials = auth-scheme #auth-param

      Note that many browsers will only recognize Basic and will require
      that it be the first auth-scheme presented. Servers should only
      include Basic if it is minimally acceptable.

   The protection space determines the domain over which credentials can
   be automatically applied. If a prior request has been authorized, the
   same credentials MAY be reused for all other requests within that
   protection space for a period of time determined by the
   authentication scheme, parameters, and/or user preference. Unless
   otherwise defined by the authentication scheme, a single protection
   space cannot extend outside the scope of its server.

   If the origin server does not wish to accept the credentials sent
   with a request, it SHOULD return a 401 (Unauthorized) response. The
   response MUST include a WWW-Authenticate header field containing at
   least one (possibly new) challenge applicable to the requested
   resource. If a proxy does not accept the credentials sent with a
   request, it SHOULD return a 407 (Proxy Authentication Required). The
   response MUST include a Proxy-Authenticate header field containing a



Franks, et al.              Standards Track                     [Page 4]

RFC 2617                  HTTP Authentication                  June 1999


   (possibly new) challenge applicable to the proxy for the requested
   resource.

   The HTTP protocol does not restrict applications to this simple
   challenge-response mechanism for access authentication. Additional
   mechanisms MAY be used, such as encryption at the transport level or
   via message encapsulation, and with additional header fields
   specifying authentication information. However, these additional
   mechanisms are not defined by this specification.

   Proxies MUST be completely transparent regarding user agent
   authentication by origin servers. That is, they must forward the
   WWW-Authenticate and Authorization headers untouched, and follow the
   rules found in section 14.8 of [2]. Both the Proxy-Authenticate and
   the Proxy-Authorization header fields are hop-by-hop headers (see
   section 13.5.1 of [2]).

2 Basic Authentication Scheme

   The "basic" authentication scheme is based on the model that the
   client must authenticate itself with a user-ID and a password for
   each realm.  The realm value should be considered an opaque string
   which can only be compared for equality with other realms on that
   server. The server will service the request only if it can validate
   the user-ID and password for the protection space of the Request-URI.
   There are no optional authentication parameters.

   For Basic, the framework above is utilized as follows:

      challenge   = "Basic" realm
      credentials = "Basic" basic-credentials

   Upon receipt of an unauthorized request for a URI within the
   protection space, the origin server MAY respond with a challenge like
   the following:

      WWW-Authenticate: Basic realm="WallyWorld"

   where "WallyWorld" is the string assigned by the server to identify
   the protection space of the Request-URI. A proxy may respond with the
   same challenge using the Proxy-Authenticate header field.

   To receive authorization, the client sends the userid and password,
   separated by a single colon (":") character, within a base64 [7]
   encoded string in the credentials.

      basic-credentials = base64-user-pass
      base64-user-pass  = <base64 [4] encoding of user-pass,



Franks, et al.              Standards Track                     [Page 5]

RFC 2617                  HTTP Authentication                  June 1999


                       except not limited to 76 char/line>
      user-pass   = userid ":" password
      userid      = *<TEXT excluding ":">
      password    = *TEXT

   Userids might be case sensitive.

   If the user agent wishes to send the userid "Aladdin" and password
   "open sesame", it would use the following header field:

      Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

   A client SHOULD assume that all paths at or deeper than the depth of
   the last symbolic element in the path field of the Request-URI also
   are within the protection space specified by the Basic realm value of
   the current challenge. A client MAY preemptively send the
   corresponding Authorization header with requests for resources in
   that space without receipt of another challenge from the server.
   Similarly, when a client sends a request to a proxy, it may reuse a
   userid and password in the Proxy-Authorization header field without
   receiving another challenge from the proxy server. See section 4 for
   security considerations associated with Basic authentication.

3 Digest Access Authentication Scheme

3.1 Introduction

3.1.1 Purpose

   The protocol referred to as "HTTP/1.0" includes the specification for
   a Basic Access Authentication scheme[1]. That scheme is not
   considered to be a secure method of user authentication, as the user
   name and password are passed over the network in an unencrypted form.
   This section provides the specification for a scheme that does not
   send the password in cleartext,  referred to as "Digest Access
   Authentication".

   The Digest Access Authentication scheme is not intended to be a
   complete answer to the need for security in the World Wide Web. This
   scheme provides no encryption of message content. The intent is
   simply to create an access authentication method that avoids the most
   serious flaws of Basic authentication.

3.1.2 Overall Operation

   Like Basic Access Authentication, the Digest scheme is based on a
   simple challenge-response paradigm. The Digest scheme challenges
   using a nonce value. A valid response contains a checksum (by



Franks, et al.              Standards Track                     [Page 6]

RFC 2617                  HTTP Authentication                  June 1999


   default, the MD5 checksum) of the username, the password, the given
   nonce value, the HTTP method, and the requested URI. In this way, the
   password is never sent in the clear. Just as with the Basic scheme,
   the username and password must be prearranged in some fashion not
   addressed by this document.

3.1.3 Representation of digest values

   An optional header allows the server to specify the algorithm used to
   create the checksum or digest. By default the MD5 algorithm is used
   and that is the only algorithm described in this document.

   For the purposes of this document, an MD5 digest of 128 bits is
   represented as 32 ASCII printable characters. The bits in the 128 bit
   digest are converted from most significant to least significant bit,
   four bits at a time to their ASCII presentation as follows. Each four
   bits is represented by its familiar hexadecimal notation from the
   characters 0123456789abcdef. That is, binary 0000 gets represented by
   the character '0', 0001, by '1', and so on up to the representation
   of 1111 as 'f'.

3.1.4 Limitations

   The Digest authentication scheme described in this document suffers
   from many known limitations. It is intended as a replacement for
   Basic authentication and nothing more. It is a password-based system
   and (on the server side) suffers from all the same problems of any
   password system. In particular, no provision is made in this protocol
   for the initial secure arrangement between user and server to
   establish the user's password.

   Users and implementors should be aware that this protocol is not as
   secure as Kerberos, and not as secure as any client-side private-key
   scheme. Nevertheless it is better than nothing, better than what is
   commonly used with telnet and ftp, and better than Basic
   authentication.

3.2 Specification of Digest Headers

   The Digest Access Authentication scheme is conceptually similar to
   the Basic scheme. The formats of the modified WWW-Authenticate header
   line and the Authorization header line are specified below. In
   addition, a new header, Authentication-Info, is specified.








Franks, et al.              Standards Track                     [Page 7]

RFC 2617                  HTTP Authentication                  June 1999


3.2.1 The WWW-Authenticate Response Header

   If a server receives a request for an access-protected object, and an
   acceptable Authorization header is not sent, the server responds with
   a "401 Unauthorized" status code, and a WWW-Authenticate header as
   per the framework defined above, which for the digest scheme is
   utilized as follows:

      challenge        =  "Digest" digest-challenge

      digest-challenge  = 1#( realm | [ domain ] | nonce |
                          [ opaque ] |[ stale ] | [ algorithm ] |
                          [ qop-options ] | [auth-param] )


      domain            = "domain" "=" <"> URI ( 1*SP URI ) <">
      URI               = absoluteURI | abs_path
      nonce             = "nonce" "=" nonce-value
      nonce-value       = quoted-string
      opaque            = "opaque" "=" quoted-string
      stale             = "stale" "=" ( "true" | "false" )
      algorithm         = "algorithm" "=" ( "MD5" | "MD5-sess" |
                           token )
      qop-options       = "qop" "=" <"> 1#qop-value <">
      qop-value         = "auth" | "auth-int" | token

   The meanings of the values of the directives used above are as
   follows:

   realm
     A string to be displayed to users so they know which username and
     password to use. This string should contain at least the name of
     the host performing the authentication and might additionally
     indicate the collection of users who might have access. An example
     might be "registered_users@gotham.news.com".

   domain
     A quoted, space-separated list of URIs, as specified in RFC XURI
     [7], that define the protection space.  If a URI is an abs_path, it
     is relative to the canonical root URL (see section 1.2 above) of
     the server being accessed. An absoluteURI in this list may refer to
     a different server than the one being accessed. The client can use
     this list to determine the set of URIs for which the same
     authentication information may be sent: any URI that has a URI in
     this list as a prefix (after both have been made absolute) may be
     assumed to be in the same protection space. If this directive is
     omitted or its value is empty, the client should assume that the
     protection space consists of all URIs on the responding server.



Franks, et al.              Standards Track                     [Page 8]

RFC 2617                  HTTP Authentication                  June 1999


     This directive is not meaningful in Proxy-Authenticate headers, for
     which the protection space is always the entire proxy; if present
     it should be ignored.

   nonce
     A server-specified data string which should be uniquely generated
     each time a 401 response is made. It is recommended that this
     string be base64 or hexadecimal data. Specifically, since the
     string is passed in the header lines as a quoted string, the
     double-quote character is not allowed.

     The contents of the nonce are implementation dependent. The quality
     of the implementation depends on a good choice. A nonce might, for
     example, be constructed as the base 64 encoding of

         time-stamp H(time-stamp ":" ETag ":" private-key)

     where time-stamp is a server-generated time or other non-repeating
     value, ETag is the value of the HTTP ETag header associated with
     the requested entity, and private-key is data known only to the
     server.  With a nonce of this form a server would recalculate the
     hash portion after receiving the client authentication header and
     reject the request if it did not match the nonce from that header
     or if the time-stamp value is not recent enough. In this way the
     server can limit the time of the nonce's validity. The inclusion of
     the ETag prevents a replay request for an updated version of the
     resource.  (Note: including the IP address of the client in the
     nonce would appear to offer the server the ability to limit the
     reuse of the nonce to the same client that originally got it.
     However, that would break proxy farms, where requests from a single
     user often go through different proxies in the farm. Also, IP
     address spoofing is not that hard.)

     An implementation might choose not to accept a previously used
     nonce or a previously used digest, in order to protect against a
     replay attack. Or, an implementation might choose to use one-time
     nonces or digests for POST or PUT requests and a time-stamp for GET
     requests.  For more details on the issues involved see section 4.
     of this document.

     The nonce is opaque to the client.

   opaque
     A string of data, specified by the server, which should be returned
     by the client unchanged in the Authorization header of subsequent
     requests with URIs in the same protection space. It is recommended
     that this string be base64 or hexadecimal data.




Franks, et al.              Standards Track                     [Page 9]

RFC 2617                  HTTP Authentication                  June 1999


   stale
     A flag, indicating that the previous request from the client was
     rejected because the nonce value was stale. If stale is TRUE
     (case-insensitive), the client may wish to simply retry the request
     with a new encrypted response, without reprompting the user for a
     new username and password. The server should only set stale to TRUE
     if it receives a request for which the nonce is invalid but with a
     valid digest for that nonce (indicating that the client knows the
     correct username/password). If stale is FALSE, or anything other
     than TRUE, or the stale directive is not present, the username
     and/or password are invalid, and new values must be obtained.

   algorithm
     A string indicating a pair of algorithms used to produce the digest
     and a checksum. If this is not present it is assumed to be "MD5".
     If the algorithm is not understood, the challenge should be ignored
     (and a different one used, if there is more than one).

     In this document the string obtained by applying the digest
     algorithm to the data "data" with secret "secret" will be denoted
     by KD(secret, data), and the string obtained by applying the
     checksum algorithm to the data "data" will be denoted H(data). The
     notation unq(X) means the value of the quoted-string X without the
     surrounding quotes.

     For the "MD5" and "MD5-sess" algorithms

         H(data) = MD5(data)

     and

         KD(secret, data) = H(concat(secret, ":", data))

     i.e., the digest is the MD5 of the secret concatenated with a colon
     concatenated with the data. The "MD5-sess" algorithm is intended to
     allow efficient 3rd party authentication servers; for the
     difference in usage, see the description in section 3.2.2.2.

   qop-options
     This directive is optional, but is made so only for backward
     compatibility with RFC 2069 [6]; it SHOULD be used by all
     implementations compliant with this version of the Digest scheme.
     If present, it is a quoted string of one or more tokens indicating
     the "quality of protection" values supported by the server.  The
     value "auth" indicates authentication; the value "auth-int"
     indicates authentication with integrity protection; see the





Franks, et al.              Standards Track                    [Page 10]

RFC 2617                  HTTP Authentication                  June 1999


     descriptions below for calculating the response directive value for
     the application of this choice. Unrecognized options MUST be
     ignored.

   auth-param
     This directive allows for future extensions. Any unrecognized
     directive MUST be ignored.

3.2.2 The Authorization Request Header

   The client is expected to retry the request, passing an Authorization
   header line, which is defined according to the framework above,
   utilized as follows.

       credentials      = "Digest" digest-response
       digest-response  = 1#( username | realm | nonce | digest-uri
                       | response | [ algorithm ] | [cnonce] |
                       [opaque] | [message-qop] |
                           [nonce-count]  | [auth-param] )

       username         = "username" "=" username-value
       username-value   = quoted-string
       digest-uri       = "uri" "=" digest-uri-value
       digest-uri-value = request-uri   ; As specified by HTTP/1.1
       message-qop      = "qop" "=" qop-value
       cnonce           = "cnonce" "=" cnonce-value
       cnonce-value     = nonce-value
       nonce-count      = "nc" "=" nc-value
       nc-value         = 8LHEX
       response         = "response" "=" request-digest
       request-digest = <"> 32LHEX <">
       LHEX             =  "0" | "1" | "2" | "3" |
                           "4" | "5" | "6" | "7" |
                           "8" | "9" | "a" | "b" |
                           "c" | "d" | "e" | "f"

   The values of the opaque and algorithm fields must be those supplied
   in the WWW-Authenticate response header for the entity being
   requested.

   response
     A string of 32 hex digits computed as defined below, which proves
     that the user knows a password

   username
     The user's name in the specified realm.





Franks, et al.              Standards Track                    [Page 11]

RFC 2617                  HTTP Authentication                  June 1999


   digest-uri
     The URI from Request-URI of the Request-Line; duplicated here
     because proxies are allowed to change the Request-Line in transit.

   qop
     Indicates what "quality of protection" the client has applied to
     the message. If present, its value MUST be one of the alternatives
     the server indicated it supports in the WWW-Authenticate header.
     These values affect the computation of the request-digest. Note
     that this is a single token, not a quoted list of alternatives as
     in WWW- Authenticate.  This directive is optional in order to
     preserve backward compatibility with a minimal implementation of
     RFC 2069 [6], but SHOULD be used if the server indicated that qop
     is supported by providing a qop directive in the WWW-Authenticate
     header field.

   cnonce
     This MUST be specified if a qop directive is sent (see above), and
     MUST NOT be specified if the server did not send a qop directive in
     the WWW-Authenticate header field.  The cnonce-value is an opaque
     quoted string value provided by the client and used by both client
     and server to avoid chosen plaintext attacks, to provide mutual
     authentication, and to provide some message integrity protection.
     See the descriptions below of the calculation of the response-
     digest and request-digest values.

   nonce-count
     This MUST be specified if a qop directive is sent (see above), and
     MUST NOT be specified if the server did not send a qop directive in
     the WWW-Authenticate header field.  The nc-value is the hexadecimal
     count of the number of requests (including the current request)
     that the client has sent with the nonce value in this request.  For
     example, in the first request sent in response to a given nonce
     value, the client sends "nc=00000001".  The purpose of this
     directive is to allow the server to detect request replays by
     maintaining its own copy of this count - if the same nc-value is
     seen twice, then the request is a replay.   See the description
     below of the construction of the request-digest value.

   auth-param
     This directive allows for future extensions. Any unrecognized
     directive MUST be ignored.

   If a directive or its value is improper, or required directives are
   missing, the proper response is 400 Bad Request. If the request-
   digest is invalid, then a login failure should be logged, since
   repeated login failures from a single client may indicate an attacker
   attempting to guess passwords.



Franks, et al.              Standards Track                    [Page 12]

RFC 2617                  HTTP Authentication                  June 1999


   The definition of request-digest above indicates the encoding for its
   value. The following definitions show how the value is computed.

3.2.2.1 Request-Digest

   If the "qop" value is "auth" or "auth-int":

      request-digest  = <"> < KD ( H(A1),     unq(nonce-value)
                                          ":" nc-value
                                          ":" unq(cnonce-value)
                                          ":" unq(qop-value)
                                          ":" H(A2)
                                  ) <">

   If the "qop" directive is not present (this construction is for
   compatibility with RFC 2069):

      request-digest  =
                 <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) >
   <">

   See below for the definitions for A1 and A2.

3.2.2.2 A1

   If the "algorithm" directive's value is "MD5" or is unspecified, then
   A1 is:

      A1       = unq(username-value) ":" unq(realm-value) ":" passwd

   where

      passwd   = < user's password >

   If the "algorithm" directive's value is "MD5-sess", then A1 is
   calculated only once - on the first request by the client following
   receipt of a WWW-Authenticate challenge from the server.  It uses the
   server nonce from that challenge, and the first client nonce value to
   construct A1 as follows:

      A1       = H( unq(username-value) ":" unq(realm-value)
                     ":" passwd )
                     ":" unq(nonce-value) ":" unq(cnonce-value)

   This creates a 'session key' for the authentication of subsequent
   requests and responses which is different for each "authentication
   session", thus limiting the amount of material hashed with any one
   key.  (Note: see further discussion of the authentication session in



Franks, et al.              Standards Track                    [Page 13]

RFC 2617                  HTTP Authentication                  June 1999


   section 3.3.) Because the server need only use the hash of the user
   credentials in order to create the A1 value, this construction could
   be used in conjunction with a third party authentication service so
   that the web server would not need the actual password value.  The
   specification of such a protocol is beyond the scope of this
   specification.

3.2.2.3 A2

   If the "qop" directive's value is "auth" or is unspecified, then A2
   is:

      A2       = Method ":" digest-uri-value

   If the "qop" value is "auth-int", then A2 is:

      A2       = Method ":" digest-uri-value ":" H(entity-body)

3.2.2.4 Directive values and quoted-string

   Note that the value of many of the directives, such as "username-
   value", are defined as a "quoted-string". However, the "unq" notation
   indicates that surrounding quotation marks are removed in forming the
   string A1. Thus if the Authorization header includes the fields

     username="Mufasa", realm=myhost@testrealm.com

   and the user Mufasa has password "Circle Of Life" then H(A1) would be
   H(Mufasa:myhost@testrealm.com:Circle Of Life) with no quotation marks
   in the digested string.

   No white space is allowed in any of the strings to which the digest
   function H() is applied unless that white space exists in the quoted
   strings or entity body whose contents make up the string to be
   digested. For example, the string A1 illustrated above must be

        Mufasa:myhost@testrealm.com:Circle Of Life

   with no white space on either side of the colons, but with the white
   space between the words used in the password value.  Likewise, the
   other strings digested by H() must not have white space on either
   side of the colons which delimit their fields unless that white space
   was in the quoted strings or entity body being digested.

   Also note that if integrity protection is applied (qop=auth-int), the
   H(entity-body) is the hash of the entity body, not the message body -
   it is computed before any transfer encoding is applied by the sender




Franks, et al.              Standards Track                    [Page 14]

RFC 2617                  HTTP Authentication                  June 1999


   and after it has been removed by the recipient. Note that this
   includes multipart boundaries and embedded headers in each part of
   any multipart content-type.

3.2.2.5 Various considerations

   The "Method" value is the HTTP request method as specified in section
   5.1.1 of [2]. The "request-uri" value is the Request-URI from the
   request line as specified in section 5.1.2 of [2]. This may be "*",
   an "absoluteURL" or an "abs_path" as specified in section 5.1.2 of
   [2], but it MUST agree with the Request-URI. In particular, it MUST
   be an "absoluteURL" if the Request-URI is an "absoluteURL". The
   "cnonce-value" is an optional  client-chosen value whose purpose is
   to foil chosen plaintext attacks.

   The authenticating server must assure that the resource designated by
   the "uri" directive is the same as the resource specified in the
   Request-Line; if they are not, the server SHOULD return a 400 Bad
   Request error. (Since this may be a symptom of an attack, server
   implementers may want to consider logging such errors.) The purpose
   of duplicating information from the request URL in this field is to
   deal with the possibility that an intermediate proxy may alter the
   client's Request-Line. This altered (but presumably semantically
   equivalent) request would not result in the same digest as that
   calculated by the client.

   Implementers should be aware of how authenticated transactions
   interact with shared caches. The HTTP/1.1 protocol specifies that
   when a shared cache (see section 13.7 of [2]) has received a request
   containing an Authorization header and a response from relaying that
   request, it MUST NOT return that response as a reply to any other
   request, unless one of two Cache-Control (see section 14.9 of [2])
   directives was present in the response. If the original response
   included the "must-revalidate" Cache-Control directive, the cache MAY
   use the entity of that response in replying to a subsequent request,
   but MUST first revalidate it with the origin server, using the
   request headers from the new request to allow the origin server to
   authenticate the new request. Alternatively, if the original response
   included the "public" Cache-Control directive, the response entity
   MAY be returned in reply to any subsequent request.

3.2.3 The Authentication-Info Header

   The Authentication-Info header is used by the server to communicate
   some information regarding the successful authentication in the
   response.





Franks, et al.              Standards Track                    [Page 15]

RFC 2617                  HTTP Authentication                  June 1999


        AuthenticationInfo = "Authentication-Info" ":" auth-info
        auth-info          = 1#(nextnonce | [ message-qop ]
                               | [ response-auth ] | [ cnonce ]
                               | [nonce-count] )
        nextnonce          = "nextnonce" "=" nonce-value
        response-auth      = "rspauth" "=" response-digest
        response-digest    = <"> *LHEX <">

   The value of the nextnonce directive is the nonce the server wishes
   the client to use for a future authentication response.  The server
   may send the Authentication-Info header with a nextnonce field as a
   means of implementing one-time or otherwise changing  nonces. If the
   nextnonce field is present the client SHOULD use it when constructing
   the Authorization header for its next request. Failure of the client
   to do so may result in a request to re-authenticate from the server
   with the "stale=TRUE".

     Server implementations should carefully consider the performance
     implications of the use of this mechanism; pipelined requests will
     not be possible if every response includes a nextnonce directive
     that must be used on the next request received by the server.
     Consideration should be given to the performance vs. security
     tradeoffs of allowing an old nonce value to be used for a limited
     time to permit request pipelining.  Use of the nonce-count can
     retain most of the security advantages of a new server nonce
     without the deleterious affects on pipelining.

   message-qop
     Indicates the "quality of protection" options applied to the
     response by the server.  The value "auth" indicates authentication;
     the value "auth-int" indicates authentication with integrity
     protection. The server SHOULD use the same value for the message-
     qop directive in the response as was sent by the client in the
     corresponding request.

   The optional response digest in the "response-auth" directive
   supports mutual authentication -- the server proves that it knows the
   user's secret, and with qop=auth-int also provides limited integrity
   protection of the response. The "response-digest" value is calculated
   as for the "request-digest" in the Authorization header, except that
   if "qop=auth" or is not specified in the Authorization header for the
   request, A2 is

      A2       = ":" digest-uri-value

   and if "qop=auth-int", then A2 is

      A2       = ":" digest-uri-value ":" H(entity-body)



Franks, et al.              Standards Track                    [Page 16]

RFC 2617                  HTTP Authentication                  June 1999


   where "digest-uri-value" is the value of the "uri" directive on the
   Authorization header in the request. The "cnonce-value" and "nc-
   value" MUST be the ones for the client request to which this message
   is the response. The "response-auth", "cnonce", and "nonce-count"
   directives MUST BE present if "qop=auth" or "qop=auth-int" is
   specified.

   The Authentication-Info header is allowed in the trailer of an HTTP
   message transferred via chunked transfer-coding.

3.3 Digest Operation

   Upon receiving the Authorization header, the server may check its
   validity by looking up the password that corresponds to the submitted
   username. Then, the server must perform the same digest operation
   (e.g., MD5) performed by the client, and compare the result to the
   given request-digest value.

   Note that the HTTP server does not actually need to know the user's
   cleartext password. As long as H(A1) is available to the server, the
   validity of an Authorization header may be verified.

   The client response to a WWW-Authenticate challenge for a protection
   space starts an authentication session with that protection space.
   The authentication session lasts until the client receives another
   WWW-Authenticate challenge from any server in the protection space. A
   client should remember the username, password, nonce, nonce count and
   opaque values associated with an authentication session to use to
   construct the Authorization header in future requests within that
   protection space. The Authorization header may be included
   preemptively; doing so improves server efficiency and avoids extra
   round trips for authentication challenges. The server may choose to
   accept the old Authorization header information, even though the
   nonce value included might not be fresh. Alternatively, the server
   may return a 401 response with a new nonce value, causing the client
   to retry the request; by specifying stale=TRUE with this response,
   the server tells the client to retry with the new nonce, but without
   prompting for a new username and password.

   Because the client is required to return the value of the opaque
   directive given to it by the server for the duration of a session,
   the opaque data may be used to transport authentication session state
   information. (Note that any such use can also be accomplished more
   easily and safely by including the state in the nonce.) For example,
   a server could be responsible for authenticating content that
   actually sits on another server. It would achieve this by having the
   first 401 response include a domain directive whose value includes a
   URI on the second server, and an opaque directive whose value



Franks, et al.              Standards Track                    [Page 17]

RFC 2617                  HTTP Authentication                  June 1999


   contains the state information. The client will retry the request, at
   which time the server might respond with a 301/302 redirection,
   pointing to the URI on the second server. The client will follow the
   redirection, and pass an Authorization header , including the
   <opaque> data.

   As with the basic scheme, proxies must be completely transparent in
   the Digest access authentication scheme. That is, they must forward
   the WWW-Authenticate, Authentication-Info and Authorization headers
   untouched. If a proxy wants to authenticate a client before a request
   is forwarded to the server, it can be done using the Proxy-
   Authenticate and Proxy-Authorization headers described in section 3.6
   below.

3.4 Security Protocol Negotiation

   It is useful for a server to be able to know which security schemes a
   client is capable of handling.

   It is possible that a server may want to require Digest as its
   authentication method, even if the server does not know that the
   client supports it. A client is encouraged to fail gracefully if the
   server specifies only authentication schemes it cannot handle.

3.5 Example

   The following example assumes that an access-protected document is
   being requested from the server via a GET request. The URI of the
   document is "http://www.nowhere.org/dir/index.html". Both client and
   server know that the username for this document is "Mufasa", and the
   password is "Circle Of Life" (with one space between each of the
   three words).

   The first time the client requests the document, no Authorization
   header is sent, so the server responds with:

         HTTP/1.1 401 Unauthorized
         WWW-Authenticate: Digest
                 realm="testrealm@host.com",
                 qop="auth,auth-int",
                 nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                 opaque="5ccc069c403ebaf9f0171e9517f40e41"

   The client may prompt the user for the username and password, after
   which it will respond with a new request, including the following
   Authorization header:





Franks, et al.              Standards Track                    [Page 18]

RFC 2617                  HTTP Authentication                  June 1999


         Authorization: Digest username="Mufasa",
                 realm="testrealm@host.com",
                 nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                 uri="/dir/index.html",
                 qop=auth,
                 nc=00000001,
                 cnonce="0a4f113b",
                 response="6629fae49393a05397450978507c4ef1",
                 opaque="5ccc069c403ebaf9f0171e9517f40e41"

3.6 Proxy-Authentication and Proxy-Authorization

   The digest authentication scheme may also be used for authenticating
   users to proxies, proxies to proxies, or proxies to origin servers by
   use of the Proxy-Authenticate and Proxy-Authorization headers. These
   headers are instances of the Proxy-Authenticate and Proxy-
   Authorization headers specified in sections 10.33 and 10.34 of the
   HTTP/1.1 specification [2] and their behavior is subject to
   restrictions described there. The transactions for proxy
   authentication are very similar to those already described. Upon
   receiving a request which requires authentication, the proxy/server
   must issue the "407 Proxy Authentication Required" response with a
   "Proxy-Authenticate" header.  The digest-challenge used in the
   Proxy-Authenticate header is the same as that for the WWW-
   Authenticate header as defined above in section 3.2.1.

   The client/proxy must then re-issue the request with a Proxy-
   Authorization header, with directives as specified for the
   Authorization header in section 3.2.2 above.

   On subsequent responses, the server sends Proxy-Authentication-Info
   with directives the same as those for the Authentication-Info header
   field.

   Note that in principle a client could be asked to authenticate itself
   to both a proxy and an end-server, but never in the same response.

4 Security Considerations

4.1 Authentication of Clients using Basic Authentication

   The Basic authentication scheme is not a secure method of user
   authentication, nor does it in any way protect the entity, which is
   transmitted in cleartext across the physical network used as the
   carrier. HTTP does not prevent additional authentication schemes and
   encryption mechanisms from being employed to increase security or the
   addition of enhancements (such as schemes to use one-time passwords)
   to Basic authentication.



Franks, et al.              Standards Track                    [Page 19]

RFC 2617                  HTTP Authentication                  June 1999


   The most serious flaw in Basic authentication is that it results in
   the essentially cleartext transmission of the user's password over
   the physical network. It is this problem which Digest Authentication
   attempts to address.

   Because Basic authentication involves the cleartext transmission of
   passwords it SHOULD NOT be used (without enhancements) to protect
   sensitive or valuable information.

   A common use of Basic authentication is for identification purposes
   -- requiring the user to provide a user name and password as a means
   of identification, for example, for purposes of gathering accurate
   usage statistics on a server. When used in this way it is tempting to
   think that there is no danger in its use if illicit access to the
   protected documents is not a major concern. This is only correct if
   the server issues both user name and password to the users and in
   particular does not allow the user to choose his or her own password.
   The danger arises because naive users frequently reuse a single
   password to avoid the task of maintaining multiple passwords.

   If a server permits users to select their own passwords, then the
   threat is not only unauthorized access to documents on the server but
   also unauthorized access to any other resources on other systems that
   the user protects with the same password. Furthermore, in the
   server's password database, many of the passwords may also be users'
   passwords for other sites. The owner or administrator of such a
   system could therefore expose all users of the system to the risk of
   unauthorized access to all those sites if this information is not
   maintained in a secure fashion.

   Basic Authentication is also vulnerable to spoofing by counterfeit
   servers. If a user can be led to believe that he is connecting to a
   host containing information protected by Basic authentication when,
   in fact, he is connecting to a hostile server or gateway, then the
   attacker can request a password, store it for later use, and feign an
   error. This type of attack is not possible with Digest
   Authentication. Server implementers SHOULD guard against the
   possibility of this sort of counterfeiting by gateways or CGI
   scripts. In particular it is very dangerous for a server to simply
   turn over a connection to a gateway.  That gateway can then use the
   persistent connection mechanism to engage in multiple transactions
   with the client while impersonating the original server in a way that
   is not detectable by the client.

4.2 Authentication of Clients using Digest Authentication

   Digest Authentication does not provide a strong authentication
   mechanism, when compared to public key based mechanisms, for example.



Franks, et al.              Standards Track                    [Page 20]

RFC 2617                  HTTP Authentication                  June 1999


   However, it is significantly stronger than (e.g.) CRAM-MD5, which has
   been proposed for use with LDAP [10], POP and IMAP (see RFC 2195
   [9]).  It is intended to replace the much weaker and even more
   dangerous Basic mechanism.

   Digest Authentication offers no confidentiality protection beyond
   protecting the actual password. All of the rest of the request and
   response are available to an eavesdropper.

   Digest Authentication offers only limited integrity protection for
   the messages in either direction. If  qop=auth-int mechanism is used,
   those parts of the message used in the calculation of the WWW-
   Authenticate and Authorization header field response directive values
   (see section 3.2 above) are  protected.  Most header fields and their
   values could be modified as a part of a man-in-the-middle attack.

   Many needs for secure HTTP transactions cannot be met by Digest
   Authentication. For those needs TLS or SHTTP are more appropriate
   protocols. In particular Digest authentication cannot be used for any
   transaction requiring confidentiality protection.  Nevertheless many
   functions remain for which Digest authentication is both useful and
   appropriate.  Any service in present use that uses Basic should be
   switched to Digest as soon as practical.

4.3 Limited Use Nonce Values

   The Digest scheme uses a server-specified nonce to seed the
   generation of the request-digest value (as specified in section
   3.2.2.1 above).  As shown in the example nonce in section 3.2.1, the
   server is free to construct the nonce such that it may only be used
   from a particular client, for a particular resource, for a limited
   period of time or number of uses, or any other restrictions.  Doing
   so strengthens the protection provided against, for example, replay
   attacks (see 4.5).  However, it should be noted that the method
   chosen for generating and checking the nonce also has performance and
   resource implications.  For example, a server may choose to allow
   each nonce value to be used only once by maintaining a record of
   whether or not each recently issued nonce has been returned and
   sending a next-nonce directive in the Authentication-Info header
   field of every response. This protects against even an immediate
   replay attack, but has a high cost checking nonce values, and perhaps
   more important will cause authentication failures for any pipelined
   requests (presumably returning a stale nonce indication).  Similarly,
   incorporating a request-specific element such as the Etag value for a
   resource limits the use of the nonce to that version of the resource
   and also defeats pipelining. Thus it may be useful to do so for
   methods with side effects but have unacceptable performance for those
   that do not.



Franks, et al.              Standards Track                    [Page 21]

RFC 2617                  HTTP Authentication                  June 1999


4.4 Comparison of Digest with Basic Authentication

   Both Digest and Basic Authentication are very much on the weak end of
   the security strength spectrum. But a comparison between the two
   points out the utility, even necessity, of replacing Basic by Digest.

   The greatest threat to the type of transactions for which these
   protocols are used is network snooping. This kind of transaction
   might involve, for example, online access to a database whose use is
   restricted to paying subscribers. With Basic authentication an
   eavesdropper can obtain the password of the user. This not only
   permits him to access anything in the database, but, often worse,
   will permit access to anything else the user protects with the same
   password.

   By contrast, with Digest Authentication the eavesdropper only gets
   access to the transaction in question and not to the user's password.
   The information gained by the eavesdropper would permit a replay
   attack, but only with a request for the same document, and even that
   may be limited by the server's choice of nonce.

4.5 Replay Attacks

   A replay attack against Digest authentication would usually be
   pointless for a simple GET request since an eavesdropper would
   already have seen the only document he could obtain with a replay.
   This is because the URI of the requested document is digested in the
   client request and the server will only deliver that document. By
   contrast under Basic Authentication once the eavesdropper has the
   user's password, any document protected by that password is open to
   him.

   Thus, for some purposes, it is necessary to protect against replay
   attacks. A good Digest implementation can do this in various ways.
   The server created "nonce" value is implementation dependent, but if
   it contains a digest of the client IP, a time-stamp, the resource
   ETag, and a private server key (as recommended above) then a replay
   attack is not simple. An attacker must convince the server that the
   request is coming from a false IP address and must cause the server
   to deliver the document to an IP address different from the address
   to which it believes it is sending the document. An attack can only
   succeed in the period before the time-stamp expires. Digesting the
   client IP and time-stamp in the nonce permits an implementation which
   does not maintain state between transactions.

   For applications where no possibility of replay attack can be
   tolerated the server can use one-time nonce values which will not be
   honored for a second use. This requires the overhead of the server



Franks, et al.              Standards Track                    [Page 22]

RFC 2617                  HTTP Authentication                  June 1999


   remembering which nonce values have been used until the nonce time-
   stamp (and hence the digest built with it) has expired, but it
   effectively protects against replay attacks.

   An implementation must give special attention to the possibility of
   replay attacks with POST and PUT requests. Unless the server employs
   one-time or otherwise limited-use nonces and/or insists on the use of
   the integrity protection of qop=auth-int, an attacker could replay
   valid credentials from a successful request with counterfeit form
   data or other message body. Even with the use of integrity protection
   most metadata in header fields is not protected. Proper nonce
   generation and checking provides some protection against replay of
   previously used valid credentials, but see 4.8.

4.6 Weakness Created by Multiple Authentication Schemes

   An HTTP/1.1 server may return multiple challenges with a 401
   (Authenticate) response, and each challenge may use a different
   auth-scheme. A user agent MUST choose to use the strongest auth-
   scheme it understands and request credentials from the user based
   upon that challenge.

      Note that many browsers will only recognize Basic and will require
      that it be the first auth-scheme presented. Servers should only
      include Basic if it is minimally acceptable.

   When the server offers choices of authentication schemes using the
   WWW-Authenticate header, the strength of the resulting authentication
   is only as good as that of the of the weakest of the authentication
   schemes. See section 4.8 below for discussion of particular attack
   scenarios that exploit multiple authentication schemes.

4.7 Online dictionary attacks

   If the attacker can eavesdrop, then it can test any overheard
   nonce/response pairs against a list of common words. Such a list is
   usually much smaller than the total number of possible passwords. The
   cost of computing the response for each password on the list is paid
   once for each challenge.

   The server can mitigate this attack by not allowing users to select
   passwords that are in a dictionary.









Franks, et al.              Standards Track                    [Page 23]

RFC 2617                  HTTP Authentication                  June 1999


4.8 Man in the Middle

   Both Basic and Digest authentication are vulnerable to "man in the
   middle" (MITM) attacks, for example, from a hostile or compromised
   proxy. Clearly, this would present all the problems of eavesdropping.
   But it also offers some additional opportunities to the attacker.

   A possible man-in-the-middle attack would be to add a weak
   authentication scheme to the set of choices, hoping that the client
   will use one that exposes the user's credentials (e.g. password). For
   this reason, the client should always use the strongest scheme that
   it understands from the choices offered.

   An even better MITM attack would be to remove all offered choices,
   replacing them with a challenge that requests only Basic
   authentication, then uses the cleartext credentials from the Basic
   authentication to authenticate to the origin server using the
   stronger scheme it requested. A particularly insidious way to mount
   such a MITM attack would be to offer a "free" proxy caching service
   to gullible users.

   User agents should consider measures such as presenting a visual
   indication at the time of the credentials request of what
   authentication scheme is to be used, or remembering the strongest
   authentication scheme ever requested by a server and produce a
   warning message before using a weaker one. It might also be a good
   idea for the user agent to be configured to demand Digest
   authentication in general, or from specific sites.

   Or, a hostile proxy might spoof the client into making a request the
   attacker wanted rather than one the client wanted. Of course, this is
   still much harder than a comparable attack against Basic
   Authentication.

4.9 Chosen plaintext attacks

   With Digest authentication, a MITM or a malicious server can
   arbitrarily choose the nonce that the client will use to compute the
   response. This is called a "chosen plaintext" attack. The ability to
   choose the nonce is known to make cryptanalysis much easier [8].

   However, no way to analyze the MD5 one-way function used by Digest
   using chosen plaintext is currently known.

   The countermeasure against this attack is for clients to be
   configured to require the use of the optional "cnonce" directive;
   this allows the client to vary the input to the hash in a way not
   chosen by the attacker.



Franks, et al.              Standards Track                    [Page 24]

RFC 2617                  HTTP Authentication                  June 1999


4.10 Precomputed dictionary attacks

   With Digest authentication, if the attacker can execute a chosen
   plaintext attack, the attacker can precompute the response for many
   common words to a nonce of its choice, and store a dictionary of
   (response, password) pairs. Such precomputation can often be done in
   parallel on many machines. It can then use the chosen plaintext
   attack to acquire a response corresponding to that challenge, and
   just look up the password in the dictionary. Even if most passwords
   are not in the dictionary, some might be. Since the attacker gets to
   pick the challenge, the cost of computing the response for each
   password on the list can be amortized over finding many passwords. A
   dictionary with 100 million password/response pairs would take about
   3.2 gigabytes of disk storage.

   The countermeasure against this attack is to for clients to be
   configured to require the use of the optional "cnonce" directive.

4.11 Batch brute force attacks

   With Digest authentication, a MITM can execute a chosen plaintext
   attack, and can gather responses from many users to the same nonce.
   It can then find all the passwords within any subset of password
   space that would generate one of the nonce/response pairs in a single
   pass over that space. It also reduces the time to find the first
   password by a factor equal to the number of nonce/response pairs
   gathered. This search of the password space can often be done in
   parallel on many machines, and even a single machine can search large
   subsets of the password space very quickly -- reports exist of
   searching all passwords with six or fewer letters in a few hours.

   The countermeasure against this attack is to for clients to be
   configured to require the use of the optional "cnonce" directive.

4.12 Spoofing by Counterfeit Servers

   Basic Authentication is vulnerable to spoofing by counterfeit
   servers.  If a user can be led to believe that she is connecting to a
   host containing information protected by a password she knows, when
   in fact she is connecting to a hostile server, then the hostile
   server can request a password, store it away for later use, and feign
   an error.  This type of attack is more difficult with Digest
   Authentication -- but the client must know to demand that Digest
   authentication be used, perhaps using some of the techniques
   described above to counter "man-in-the-middle" attacks.  Again, the
   user can be helped in detecting this attack by a visual indication of
   the authentication mechanism in use with appropriate guidance in
   interpreting the implications of each scheme.



Franks, et al.              Standards Track                    [Page 25]

RFC 2617                  HTTP Authentication                  June 1999


4.13 Storing passwords

   Digest authentication requires that the authenticating agent (usually
   the server) store some data derived from the user's name and password
   in a "password file" associated with a given realm. Normally this
   might contain pairs consisting of username and H(A1), where H(A1) is
   the digested value of the username, realm, and password as described
   above.

   The security implications of this are that if this password file is
   compromised, then an attacker gains immediate access to documents on
   the server using this realm. Unlike, say a standard UNIX password
   file, this information need not be decrypted in order to access
   documents in the server realm associated with this file. On the other
   hand, decryption, or more likely a brute force attack, would be
   necessary to obtain the user's password. This is the reason that the
   realm is part of the digested data stored in the password file. It
   means that if one Digest authentication password file is compromised,
   it does not automatically compromise others with the same username
   and password (though it does expose them to brute force attack).

   There are two important security consequences of this. First the
   password file must be protected as if it contained unencrypted
   passwords, because for the purpose of accessing documents in its
   realm, it effectively does.

   A second consequence of this is that the realm string should be
   unique among all realms which any single user is likely to use. In
   particular a realm string should include the name of the host doing
   the authentication. The inability of the client to authenticate the
   server is a weakness of Digest Authentication.

4.14 Summary

   By modern cryptographic standards Digest Authentication is weak. But
   for a large range of purposes it is valuable as a replacement for
   Basic Authentication. It remedies some, but not all, weaknesses of
   Basic Authentication. Its strength may vary depending on the
   implementation.  In particular the structure of the nonce (which is
   dependent on the server implementation) may affect the ease of
   mounting a replay attack.  A range of server options is appropriate
   since, for example, some implementations may be willing to accept the
   server overhead of one-time nonces or digests to eliminate the
   possibility of replay. Others may satisfied with a nonce like the one
   recommended above restricted to a single IP address and a single ETag
   or with a limited lifetime.





Franks, et al.              Standards Track                    [Page 26]

RFC 2617                  HTTP Authentication                  June 1999


   The bottom line is that *any* compliant implementation will be
   relatively weak by cryptographic standards, but *any* compliant
   implementation will be far superior to Basic Authentication.

5 Sample implementation

   The following code implements the calculations of H(A1), H(A2),
   request-digest and response-digest, and a test program which computes
   the values used in the example of section 3.5. It uses the MD5
   implementation from RFC 1321.

   File "digcalc.h":

#define HASHLEN 16
typedef char HASH[HASHLEN];
#define HASHHEXLEN 32
typedef char HASHHEX[HASHHEXLEN+1];
#define IN
#define OUT

/* calculate H(A1) as per HTTP Digest spec */
void DigestCalcHA1(
    IN char * pszAlg,
    IN char * pszUserName,
    IN char * pszRealm,
    IN char * pszPassword,
    IN char * pszNonce,
    IN char * pszCNonce,
    OUT HASHHEX SessionKey
    );

/* calculate request-digest/response-digest as per HTTP Digest spec */
void DigestCalcResponse(
    IN HASHHEX HA1,           /* H(A1) */
    IN char * pszNonce,       /* nonce from server */
    IN char * pszNonceCount,  /* 8 hex digits */
    IN char * pszCNonce,      /* client nonce */
    IN char * pszQop,         /* qop-value: "", "auth", "auth-int" */
    IN char * pszMethod,      /* method from the request */
    IN char * pszDigestUri,   /* requested URL */
    IN HASHHEX HEntity,       /* H(entity body) if qop="auth-int" */
    OUT HASHHEX Response      /* request-digest or response-digest */
    );

File "digcalc.c":

#include <global.h>
#include <md5.h>



Franks, et al.              Standards Track                    [Page 27]

RFC 2617                  HTTP Authentication                  June 1999


#include <string.h>
#include "digcalc.h"

void CvtHex(
    IN HASH Bin,
    OUT HASHHEX Hex
    )
{
    unsigned short i;
    unsigned char j;

    for (i = 0; i < HASHLEN; i++) {
        j = (Bin[i] >> 4) & 0xf;
        if (j <= 9)
            Hex[i*2] = (j + '0');
         else
            Hex[i*2] = (j + 'a' - 10);
        j = Bin[i] & 0xf;
        if (j <= 9)
            Hex[i*2+1] = (j + '0');
         else
            Hex[i*2+1] = (j + 'a' - 10);
    };
    Hex[HASHHEXLEN] = '\0';
};

/* calculate H(A1) as per spec */
void DigestCalcHA1(
    IN char * pszAlg,
    IN char * pszUserName,
    IN char * pszRealm,
    IN char * pszPassword,
    IN char * pszNonce,
    IN char * pszCNonce,
    OUT HASHHEX SessionKey
    )
{
      MD5_CTX Md5Ctx;
      HASH HA1;

      MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword));
      MD5Final(HA1, &Md5Ctx);
      if (stricmp(pszAlg, "md5-sess") == 0) {



Franks, et al.              Standards Track                    [Page 28]

RFC 2617                  HTTP Authentication                  June 1999


            MD5Init(&Md5Ctx);
            MD5Update(&Md5Ctx, HA1, HASHLEN);
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
            MD5Final(HA1, &Md5Ctx);
      };
      CvtHex(HA1, SessionKey);
};

/* calculate request-digest/response-digest as per HTTP Digest spec */
void DigestCalcResponse(
    IN HASHHEX HA1,           /* H(A1) */
    IN char * pszNonce,       /* nonce from server */
    IN char * pszNonceCount,  /* 8 hex digits */
    IN char * pszCNonce,      /* client nonce */
    IN char * pszQop,         /* qop-value: "", "auth", "auth-int" */
    IN char * pszMethod,      /* method from the request */
    IN char * pszDigestUri,   /* requested URL */
    IN HASHHEX HEntity,       /* H(entity body) if qop="auth-int" */
    OUT HASHHEX Response      /* request-digest or response-digest */
    )
{
      MD5_CTX Md5Ctx;
      HASH HA2;
      HASH RespHash;
       HASHHEX HA2Hex;

      // calculate H(A2)
      MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
      if (stricmp(pszQop, "auth-int") == 0) {
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
      };
      MD5Final(HA2, &Md5Ctx);
       CvtHex(HA2, HA2Hex);

      // calculate response
      MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
      MD5Update(&Md5Ctx, ":", 1);
      if (*pszQop) {



Franks, et al.              Standards Track                    [Page 29]

RFC 2617                  HTTP Authentication                  June 1999


          MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
          MD5Update(&Md5Ctx, ":", 1);
          MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
          MD5Update(&Md5Ctx, ":", 1);
          MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
          MD5Update(&Md5Ctx, ":", 1);
      };
      MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
      MD5Final(RespHash, &Md5Ctx);
      CvtHex(RespHash, Response);
};

File "digtest.c":


#include <stdio.h>
#include "digcalc.h"

void main(int argc, char ** argv) {

      char * pszNonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093";
      char * pszCNonce = "0a4f113b";
      char * pszUser = "Mufasa";
      char * pszRealm = "testrealm@host.com";
      char * pszPass = "Circle Of Life";
      char * pszAlg = "md5";
      char szNonceCount[9] = "00000001";
      char * pszMethod = "GET";
      char * pszQop = "auth";
      char * pszURI = "/dir/index.html";
      HASHHEX HA1;
      HASHHEX HA2 = "";
      HASHHEX Response;

      DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce,
pszCNonce, HA1);
      DigestCalcResponse(HA1, pszNonce, szNonceCount, pszCNonce, pszQop,
       pszMethod, pszURI, HA2, Response);
      printf("Response = %s\n", Response);
};











Franks, et al.              Standards Track                    [Page 30]

RFC 2617                  HTTP Authentication                  June 1999


6 Acknowledgments

   Eric W. Sink, of AbiSource, Inc., was one of the original authors
   before the specification underwent substantial revision.

   In addition to the authors, valuable discussion instrumental in
   creating this document has come from Peter J. Churchyard, Ned Freed,
   and David M.  Kristol.

   Jim Gettys and Larry Masinter edited this document for update.

7 References

   [1]  Berners-Lee, T.,  Fielding, R. and H. Frystyk, "Hypertext
        Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996.

   [2]  Fielding, R.,  Gettys, J., Mogul, J., Frysyk, H., Masinter, L.,
        Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
        HTTP/1.1", RFC 2616, June 1999.

   [3]  Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April
        1992.

   [4]  Freed, N. and N. Borenstein. "Multipurpose Internet Mail
        Extensions (MIME) Part One: Format of Internet Message Bodies",
        RFC 2045, November 1996.

   [5]  Dierks, T. and C. Allen "The TLS Protocol, Version 1.0", RFC
        2246, January 1999.

   [6]  Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
        Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP :
        Digest Access Authentication", RFC 2069, January 1997.

   [7]  Berners Lee, T, Fielding, R. and L. Masinter, "Uniform Resource
        Identifiers (URI): Generic Syntax", RFC 2396, August 1998.

   [8]  Kaliski, B.,Robshaw, M., "Message Authentication with MD5",
        CryptoBytes, Sping 1995, RSA Inc,
        (http://www.rsa.com/rsalabs/pubs/cryptobytes/spring95/md5.htm)

   [9]  Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP AUTHorize
        Extension for Simple Challenge/Response", RFC 2195, September
        1997.

   [10] Morgan, B., Alvestrand, H., Hodges, J., Wahl, M.,
        "Authentication Methods for LDAP", Work in Progress.




Franks, et al.              Standards Track                    [Page 31]

RFC 2617                  HTTP Authentication                  June 1999


8 Authors' Addresses

   John Franks
   Professor of Mathematics
   Department of Mathematics
   Northwestern University
   Evanston, IL 60208-2730, USA

   EMail: john@math.nwu.edu


   Phillip M. Hallam-Baker
   Principal Consultant
   Verisign Inc.
   301 Edgewater Place
   Suite 210
   Wakefield MA 01880, USA

   EMail: pbaker@verisign.com


   Jeffery L. Hostetler
   Software Craftsman
   AbiSource, Inc.
   6 Dunlap Court
   Savoy, IL 61874

   EMail: jeff@AbiSource.com


   Scott D. Lawrence
   Agranat Systems, Inc.
   5 Clocktower Place, Suite 400
   Maynard, MA 01754, USA

   EMail: lawrence@agranat.com


   Paul J. Leach
   Microsoft Corporation
   1 Microsoft Way
   Redmond, WA 98052, USA

   EMail: paulle@microsoft.com







Franks, et al.              Standards Track                    [Page 32]

RFC 2617                  HTTP Authentication                  June 1999


   Ari Luotonen
   Member of Technical Staff
   Netscape Communications Corporation
   501 East Middlefield Road
   Mountain View, CA 94043, USA


   Lawrence C. Stewart
   Open Market, Inc.
   215 First Street
   Cambridge, MA  02142, USA

   EMail: stewart@OpenMarket.com






































Franks, et al.              Standards Track                    [Page 33]

RFC 2617                  HTTP Authentication                  June 1999


9.  Full Copyright Statement

   Copyright (C) The Internet Society (1999).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Franks, et al.              Standards Track                    [Page 34]


Added doc/rfc2818.txt.












































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                       E. Rescorla
Request for Comments: 2818                                   RTFM, Inc.
Category: Informational                                        May 2000


                             HTTP Over TLS

Status of this Memo

   This memo provides information for the Internet community.  It does
   not specify an Internet standard of any kind.  Distribution of this
   memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

Abstract

   This memo describes how to use TLS to secure HTTP connections over
   the Internet. Current practice is to layer HTTP over SSL (the
   predecessor to TLS), distinguishing secured traffic from insecure
   traffic by the use of a different server port. This document
   documents that practice using TLS. A companion document describes a
   method for using HTTP/TLS over the same port as normal HTTP
   [RFC2817].

Table of Contents

   1. Introduction  . . . . . . . . . . . . . . . . . . . . . . 2
   1.1. Requirements Terminology  . . . . . . . . . . . . . . . 2
   2. HTTP Over TLS . . . . . . . . . . . . . . . . . . . . . . 2
   2.1. Connection Initiation . . . . . . . . . . . . . . . . . 2
   2.2. Connection Closure  . . . . . . . . . . . . . . . . . . 2
   2.2.1. Client Behavior . . . . . . . . . . . . . . . . . . . 3
   2.2.2. Server Behavior . . . . . . . . . . . . . . . . . . . 3
   2.3. Port Number . . . . . . . . . . . . . . . . . . . . . . 4
   2.4. URI Format  . . . . . . . . . . . . . . . . . . . . . . 4
   3. Endpoint Identification . . . . . . . . . . . . . . . . . 4
   3.1. Server Identity . . . . . . . . . . . . . . . . . . . . 4
   3.2. Client Identity . . . . . . . . . . . . . . . . . . . . 5
   References . . . . . . . . . . . . . . . . . . . . . . . . . 6
   Security Considerations  . . . . . . . . . . . . . . . . . . 6
   Author's Address . . . . . . . . . . . . . . . . . . . . . . 6
   Full Copyright Statement . . . . . . . . . . . . . . . . . . 7






Rescorla                     Informational                      [Page 1]

RFC 2818                     HTTP Over TLS                      May 2000


1.  Introduction

   HTTP [RFC2616] was originally used in the clear on the Internet.
   However, increased use of HTTP for sensitive applications has
   required security measures. SSL, and its successor TLS [RFC2246] were
   designed to provide channel-oriented security. This document
   describes how to use HTTP over TLS.

1.1.  Requirements Terminology

   Keywords "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT" and
   "MAY" that appear in this document are to be interpreted as described
   in [RFC2119].

2.  HTTP Over TLS

   Conceptually, HTTP/TLS is very simple. Simply use HTTP over TLS
   precisely as you would use HTTP over TCP.

2.1.  Connection Initiation

   The agent acting as the HTTP client should also act as the TLS
   client.  It should initiate a connection to the server on the
   appropriate port and then send the TLS ClientHello to begin the TLS
   handshake. When the TLS handshake has finished. The client may then
   initiate the first HTTP request.  All HTTP data MUST be sent as TLS
   "application data".  Normal HTTP behavior, including retained
   connections should be followed.

2.2.  Connection Closure

   TLS provides a facility for secure connection closure. When a valid
   closure alert is received, an implementation can be assured that no
   further data will be received on that connection.  TLS
   implementations MUST initiate an exchange of closure alerts before
   closing a connection. A TLS implementation MAY, after sending a
   closure alert, close the connection without waiting for the peer to
   send its closure alert, generating an "incomplete close".  Note that
   an implementation which does this MAY choose to reuse the session.
   This SHOULD only be done when the application knows (typically
   through detecting HTTP message boundaries) that it has received all
   the message data that it cares about.

   As specified in [RFC2246], any implementation which receives a
   connection close without first receiving a valid closure alert (a
   "premature close") MUST NOT reuse that session.  Note that a
   premature close does not call into question the security of the data
   already received, but simply indicates that subsequent data might



Rescorla                     Informational                      [Page 2]

RFC 2818                     HTTP Over TLS                      May 2000


   have been truncated. Because TLS is oblivious to HTTP
   request/response boundaries, it is necessary to examine the HTTP data
   itself (specifically the Content-Length header) to determine whether
   the truncation occurred inside a message or between messages.

2.2.1.  Client Behavior

   Because HTTP uses connection closure to signal end of server data,
   client implementations MUST treat any premature closes as errors and
   the data received as potentially truncated.  While in some cases the
   HTTP protocol allows the client to find out whether truncation took
   place so that, if it received the complete reply, it may tolerate
   such errors following the principle to "[be] strict when sending and
   tolerant when receiving" [RFC1958], often truncation does not show in
   the HTTP protocol data; two cases in particular deserve special note:

     A HTTP response without a Content-Length header. Since data length
     in this situation is signalled by connection close a premature
     close generated by the server cannot be distinguished from a
     spurious close generated by an attacker.

     A HTTP response with a valid Content-Length header closed before
     all data has been read. Because TLS does not provide document
     oriented protection, it is impossible to determine whether the
     server has miscomputed the Content-Length or an attacker has
     truncated the connection.

   There is one exception to the above rule. When encountering a
   premature close, a client SHOULD treat as completed all requests for
   which it has received as much data as specified in the Content-Length
   header.

   A client detecting an incomplete close SHOULD recover gracefully.  It
   MAY resume a TLS session closed in this fashion.

   Clients MUST send a closure alert before closing the connection.
   Clients which are unprepared to receive any more data MAY choose not
   to wait for the server's closure alert and simply close the
   connection, thus generating an incomplete close on the server side.

2.2.2.  Server Behavior

   RFC 2616 permits an HTTP client to close the connection at any time,
   and requires servers to recover gracefully.  In particular, servers
   SHOULD be prepared to receive an incomplete close from the client,
   since the client can often determine when the end of server data is.
   Servers SHOULD be willing to resume TLS sessions closed in this
   fashion.



Rescorla                     Informational                      [Page 3]

RFC 2818                     HTTP Over TLS                      May 2000


   Implementation note: In HTTP implementations which do not use
   persistent connections, the server ordinarily expects to be able to
   signal end of data by closing the connection. When Content-Length is
   used, however, the client may have already sent the closure alert and
   dropped the connection.

   Servers MUST attempt to initiate an exchange of closure alerts with
   the client before closing the connection. Servers MAY close the
   connection after sending the closure alert, thus generating an
   incomplete close on the client side.

2.3.  Port Number

   The first data that an HTTP server expects to receive from the client
   is the Request-Line production. The first data that a TLS server (and
   hence an HTTP/TLS server) expects to receive is the ClientHello.
   Consequently, common practice has been to run HTTP/TLS over a
   separate port in order to distinguish which protocol is being used.
   When HTTP/TLS is being run over a TCP/IP connection, the default port
   is 443. This does not preclude HTTP/TLS from being run over another
   transport. TLS only presumes a reliable connection-oriented data
   stream.

2.4.  URI Format

   HTTP/TLS is differentiated from HTTP URIs by using the 'https'
   protocol identifier in place of the 'http' protocol identifier. An
   example URI specifying HTTP/TLS is:

     https://www.example.com/~smith/home.html

3.  Endpoint Identification

3.1.  Server Identity

   In general, HTTP/TLS requests are generated by dereferencing a URI.
   As a consequence, the hostname for the server is known to the client.
   If the hostname is available, the client MUST check it against the
   server's identity as presented in the server's Certificate message,
   in order to prevent man-in-the-middle attacks.

   If the client has external information as to the expected identity of
   the server, the hostname check MAY be omitted. (For instance, a
   client may be connecting to a machine whose address and hostname are
   dynamic but the client knows the certificate that the server will
   present.) In such cases, it is important to narrow the scope of
   acceptable certificates as much as possible in order to prevent man




Rescorla                     Informational                      [Page 4]

RFC 2818                     HTTP Over TLS                      May 2000


   in the middle attacks.  In special cases, it may be appropriate for
   the client to simply ignore the server's identity, but it must be
   understood that this leaves the connection open to active attack.

   If a subjectAltName extension of type dNSName is present, that MUST
   be used as the identity. Otherwise, the (most specific) Common Name
   field in the Subject field of the certificate MUST be used. Although
   the use of the Common Name is existing practice, it is deprecated and
   Certification Authorities are encouraged to use the dNSName instead.

   Matching is performed using the matching rules specified by
   [RFC2459].  If more than one identity of a given type is present in
   the certificate (e.g., more than one dNSName name, a match in any one
   of the set is considered acceptable.) Names may contain the wildcard
   character * which is considered to match any single domain name
   component or component fragment. E.g., *.a.com matches foo.a.com but
   not bar.foo.a.com. f*.com matches foo.com but not bar.com.

   In some cases, the URI is specified as an IP address rather than a
   hostname. In this case, the iPAddress subjectAltName must be present
   in the certificate and must exactly match the IP in the URI.

   If the hostname does not match the identity in the certificate, user
   oriented clients MUST either notify the user (clients MAY give the
   user the opportunity to continue with the connection in any case) or
   terminate the connection with a bad certificate error. Automated
   clients MUST log the error to an appropriate audit log (if available)
   and SHOULD terminate the connection (with a bad certificate error).
   Automated clients MAY provide a configuration setting that disables
   this check, but MUST provide a setting which enables it.

   Note that in many cases the URI itself comes from an untrusted
   source. The above-described check provides no protection against
   attacks where this source is compromised. For example, if the URI was
   obtained by clicking on an HTML page which was itself obtained
   without using HTTP/TLS, a man in the middle could have replaced the
   URI.  In order to prevent this form of attack, users should carefully
   examine the certificate presented by the server to determine if it
   meets their expectations.

3.2.  Client Identity

   Typically, the server has no external knowledge of what the client's
   identity ought to be and so checks (other than that the client has a
   certificate chain rooted in an appropriate CA) are not possible. If a
   server has such knowledge (typically from some source external to
   HTTP or TLS) it SHOULD check the identity as described above.




Rescorla                     Informational                      [Page 5]

RFC 2818                     HTTP Over TLS                      May 2000


References

   [RFC2459] Housley, R., Ford, W., Polk, W. and D. Solo, "Internet
             Public Key Infrastructure: Part I: X.509 Certificate and
             CRL Profile", RFC 2459, January 1999.

   [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter,
             L., Leach, P. and T. Berners-Lee, "Hypertext Transfer
             Protocol, HTTP/1.1", RFC 2616, June 1999.

   [RFC2119] Bradner, S., "Key Words for use in RFCs to indicate
             Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2246] Dierks, T. and C. Allen, "The TLS Protocol", RFC 2246,
             January 1999.

   [RFC2817] Khare, R. and S. Lawrence, "Upgrading to TLS Within
             HTTP/1.1", RFC 2817, May 2000.

Security Considerations

   This entire document is about security.

Author's Address

   Eric Rescorla
   RTFM, Inc.
   30 Newell Road, #16
   East Palo Alto, CA 94303

   Phone: (650) 328-8631
   EMail: ekr@rtfm.com



















Rescorla                     Informational                      [Page 6]

RFC 2818                     HTTP Over TLS                      May 2000


Full Copyright Statement

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Rescorla                     Informational                      [Page 7]


Added doc/rfc2964.txt.




































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                            K. Moore
Request for Comments: 2964                        University of Tennessee
BCP: 44                                                          N. Freed
Category: Best Current Practice                                  Innosoft
                                                             October 2000


                      Use of HTTP State Management

Status of this Memo

   This document specifies an Internet Best Current Practices for the
   Internet Community, and requests discussion and suggestions for
   improvements.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

IESG Note

   The IESG notes that this mechanism makes use of the .local top-level
   domain (TLD) internally when handling host names that don't contain
   any dots, and that this mechanism might not work in the expected way
   should an actual .local TLD ever be registered.

Abstract

   The mechanisms described in "HTTP State Management Mechanism" (RFC-
   2965), and its predecessor (RFC-2109), can be used for many different
   purposes.  However, some current and potential uses of the protocol
   are controversial because they have significant user privacy and
   security implications.  This memo identifies specific uses of
   Hypertext Transfer Protocol (HTTP) State Management protocol which
   are either (a) not recommended by the IETF, or (b) believed to be
   harmful, and discouraged.  This memo also details additional privacy
   considerations which are not covered by the HTTP State Management
   protocol specification.

1.  Introduction

   The HTTP State Management mechanism is both useful and controversial.
   It is useful because numerous applications of HTTP benefit from the
   ability to save state between HTTP transactions, without encoding
   such state in URLs.  It is controversial because the mechanism has
   been used to accomplish things for which it was not designed and is
   not well-suited.  Some of these uses have attracted a great deal of
   public criticism because they threaten to violate the privacy of web



Moore & Freed            Best Current Practice                  [Page 1]

RFC 2964              Use of HTTP State Management          October 2000


   users, specifically by leaking potentially sensitive information to
   third parties such as the Web sites a user has visited.  There are
   also other uses of HTTP State Management which are inappropriate even
   though they do not threaten user privacy.

   This memo therefore identifies uses of the HTTP State Management
   protocol specified in RFC-2965 which are not recommended by the IETF,
   or which are believed to be harmful and are therefore discouraged.

   This document occasionally uses terms that appear in capital letters.
   When the terms "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY"
   appear capitalized, they are being used to indicate particular
   requirements of this specification.  A discussion of the meanings of
   the terms "MUST", "SHOULD", and "MAY" appears in [RFC-1123]; the
   terms "MUST NOT" and "SHOULD NOT" are logical extensions of this
   usage.

2.  Uses of HTTP State Management

   The purpose of HTTP State Management is to allow an HTTP-based
   service to create stateful "sessions" which persist across multiple
   HTTP transactions.  A single session may involve transactions with
   multiple server hosts.  Multiple client hosts may also be involved in
   a single session when the session data for a particular user is
   shared between client hosts (e.g., via a networked file system).  In
   other words, the "session" retains state between a "user" and a
   "service", not between particular hosts.

   It's important to realize that similar capabilities may also be
   achieved using the "bare" HTTP protocol, and/or dynamically-generated
   HTML, without the State Management extensions.  For example, state
   information can be transmitted from the service to the user by
   embedding a session identifier in one or more URLs which appear in
   HTTP redirects, or dynamically generated HTML; and the state
   information may be returned from the user to the service when such
   URLs appear in a GET or POST request.  HTML forms can also be used to
   pass state information from the service to the user and back, without
   the user being aware of this happening.

   However, the HTTP State Management facility does provide an increase
   in functionality over ordinary HTTP and HTML.  In practice, this
   additional functionality includes:

   (1)   The ability to exchange URLs between users, of resources
         accessed during stateful sessions, without leaking the state
         information associated with those sessions.  (e.g. "Here's the
         URL for the FooCorp web catalog entry for those sandals that
         you wanted.")



Moore & Freed            Best Current Practice                  [Page 2]

RFC 2964              Use of HTTP State Management          October 2000


   (2)   The ability to maintain session state without "cache-busting".
         That is, separating the session state from the URL allows a web
         cache to maintain only a single copy of the named resource.  If
         the state is maintained in session-specific URLs, the cache
         would likely have to maintain several identical copies of the
         resource.

   (3)   The ability to implement sessions with minimal server
         configuration and minimal protocol overhead, as compared to
         other techniques of maintaining session state.

   (4)   The ability to associate the user with session state whenever a
         user accesses the service, regardless of whether the user
         enters through a particular "home page" or "portal".

   (5)   The ability to save session information in stable storage, so
         that a "session" can be maintained across client invocations,
         system reboots, and client or system crashes.

2.1.  Recommended Uses

   Use of HTTP State Management is appropriate whenever it is desirable
   to maintain state between a user and a service across multiple HTTP
   transactions, provided that:

   (1)   the user is aware that session state is being maintained and
         consents to it,

   (2)   the user has the ability to delete the state associated with
         such a session at any time,

   (3)   the information obtained through the ability to track the
         user's usage of the service is not disclosed to other parties
         without the user's explicit consent, and

   (4)   session information itself cannot contain sensitive information
         and cannot be used to obtain sensitive information that is not
         otherwise available to an eavesdropper.

   This last point is important because cookies are usually sent in the
   clear and hence are readily available to eavesdroppers.

   An example of such a recommended use would be a "shopping cart",
   where the existence of the shopping cart is explicitly made known to
   the user, the user can explicitly "empty" his or her shopping cart
   (either by requesting that it be emptied or by purchasing those





Moore & Freed            Best Current Practice                  [Page 3]

RFC 2964              Use of HTTP State Management          October 2000


   items) and thus cause the shared state to be discarded, and the
   service asserts that it will not disclose the user's shopping or
   browsing habits to third parties without the user's consent.

   Note that the HTTP State Management protocol effectively allows a
   service provider to refuse to provide a service, or provide a reduced
   level of service, if the user or a user's client fails to honor a
   request to maintain session state.  Absent legal prohibition to the
   contrary, the server MAY refuse to provide the service, or provide a
   reduced level of service, under these conditions.  As a purely
   practical consideration, services designed to utilize HTTP State
   Management may be unable to function properly if the client does not
   provide it.  Such servers SHOULD gracefully handle such conditions
   and explain to the user why the full level of service is not
   available.

2.2.  Problematic Uses

   The following uses of HTTP State Management are deemed inappropriate
   and contrary to this specification:

2.2.1.  Leakage of Information to Third Parties

   HTTP State Management MUST NOT be used to leak information about the
   user or the user's browsing habits to other parties besides the user
   or service, without the user's explicit consent.  Such usage is
   prohibited even if the user's name or other externally-assigned
   identifier are not exposed to other parties, because the state
   management mechanism itself provides an identifier which can be used
   to compile information about the user.

   Because such practices encourage users to defeat HTTP State
   Management mechanisms, they tend to reduce the effectiveness of HTTP
   State Management, and are therefore considered detrimental to the
   operation of the web.

2.2.2.  Use as an Authentication Mechanism

   It is generally inappropriate to use the HTTP State Management
   protocol as an authentication mechanism.  HTTP State Management is
   not designed with such use in mind, and safeguards for protection of
   authentication credentials are lacking in both the protocol
   specification and in widely deployed HTTP clients and servers.  Most
   HTTP sessions are not encrypted and "cookies" may therefore be
   exposed to passive eavesdroppers.  Furthermore, HTTP clients and
   servers typically store "cookies" in cleartext with little or no
   protection against exposure.  HTTP State Management therefore SHOULD




Moore & Freed            Best Current Practice                  [Page 4]

RFC 2964              Use of HTTP State Management          October 2000


   NOT be used as an authentication mechanism to protect information
   from being exposed to unauthorized parties, even if the HTTP sessions
   are encrypted.

   The prohibition against using HTTP State Management for
   authentication includes both its use to protect information which is
   provided by the service, and its use to protect potentially sensitive
   information about the user which is entrusted to the service's care.
   For example, it would be inappropriate to expose a user's name,
   address, telephone number, or billing information to a client that
   merely presented a cookie which had been previously associated with
   the user.

   Similarly, HTTP State Management SHOULD NOT be used to authenticate
   user requests if unauthorized requests might have undesirable side-
   effects for the user, unless the user is aware of the potential for
   such side-effects and explicitly consents to such use.  For example,
   a service which allowed a user to order merchandise with a single
   "click", based entirely on the user's stored "cookies", could
   inconvenience the user by requiring her to dispute charges to her
   credit card, and/or return the unwanted merchandise, in the event
   that the cookies were exposed to third parties.

   Some uses of HTTP State Management to identify users may be
   relatively harmless, for example, if the only information which can
   be thus exposed belongs to the service, and the service will suffer
   little harm from the exposure of such information.

3.  User Interface Considerations for HTTP State Management

   HTTP State Management has been very controversial because of its
   potential to expose information about a user's browsing habits to
   third parties, without the knowledge or consent of the user.  While
   such exposure is possible, this is less a flaw in the protocol itself
   than a failure of HTTP client implementations (and of some providers
   of HTTP-based services) to protect users' interests.

   As implied above, there are other ways to maintain session state than
   using HTTP State Management, and therefore other ways in which users'
   browsing habits can be tracked.  Indeed, it is difficult to imagine
   how the HTTP protocol or an HTTP client could actually prevent a
   service from disclosing a user's "click trail" to other parties if
   the service chose to do so.  Protection of such information from
   inappropriate exposure must therefore be the responsibility of the
   service.  HTTP client implementations inherently cannot provide such
   protection, though they can implement countermeasures which make it
   more difficult for HTTP State Management to be used as the mechanism
   by which such information is exposed.



Moore & Freed            Best Current Practice                  [Page 5]

RFC 2964              Use of HTTP State Management          October 2000


   It is arguable that HTTP clients should provide more protection in
   general against inappropriate exposure of tracking information,
   regardless of whether the exposure were facilitated by use of HTTP
   State Management or by some other means.  However, issues related to
   other mechanisms are beyond the scope of this memo.

3.1.  Capabilities Required of an HTTP Client

   A user's willingness to consent to use of HTTP State Management is
   likely to vary from one service to another, according to whether the
   user trusts the service to use the information appropriately and to
   limit its exposure to other parties.  The user therefore SHOULD be
   able to control whether his client supports a service's request to
   use HTTP State Management, on a per-service basis.  In particular:

   (1)   Clients MUST NOT respond to HTTP State Management requests
         unless explicitly enabled by the user.

   (2)   Clients SHOULD provide an effective interface which allows
         users to review, and approve or refuse, any particular requests
         from a server to maintain state information, before the client
         provides any state information to the server.

   (3)   Clients SHOULD provide an effective interface which allows
         users to instruct their clients to ignore all requests from a
         particular service to maintain state information, on a per-
         service basis, immediately in response to any particular
         request from a server, before the client provides any state
         information to the server.

   (4)   Clients SHOULD provide an effective interface which allows a
         user to disable future transmission of any state information to
         a service, and/or discard any saved state information for that
         service, even though the user has previously approved a
         service's request to maintain state information.

   (5)   Clients SHOULD provide an effective interface which allows a
         user to terminate a previous request not to retain state
         management information for a given service.

3.2.  Limitations of the domain-match algorithm

   The domain-match algorithm in RFC-2965 section 2 is intended as a
   heuristic to allow a client to "guess" whether or not two domains are
   part of the same service.  There are few rules about how domain names
   can be used, and the structure of domain names and how they are
   delegated varies from one top-level domain to another (i.e. the
   client cannot tell which part of the domain was assigned to the



Moore & Freed            Best Current Practice                  [Page 6]

RFC 2964              Use of HTTP State Management          October 2000


   service).  Therefore NO string comparison algorithm (including the
   domain-match algorithm) can be relied on to distinguish a domain that
   belongs to a particular service, from a domain that belongs to
   another party.

   As stated above, each service is ultimately responsible for ensuring
   that user information is not inappropriately leaked to third parties.
   Leaking information to third parties via State Management by careful
   selection of domain names, or by assigning domain names to hosts
   maintained by third parties, is at least as inappropriate as leaking
   the same information by other means.

4.  Security Considerations

   This entire memo is about security considerations.

5.  Authors' Addresses

   Keith Moore
   University of Tennessee Computer Science Department
   1122 Volunteer Blvd, Suite 203
   Knoxville TN, 37996-3450

   EMail: moore@cs.utk.edu


   Ned Freed
   Innosoft International, Inc.
   1050 Lakes Drive
   West Covina, CA 81790

   EMail: ned.freed@innosoft.com

6.  References

   [RFC 1123] Braden, R., "Requirements for Internet Hosts --
              Application and Support", STD 3, RFC 1123, October 1989.

   [RFC 2965] Kristol, D. and L. Montulli, "HTTP State Management
              Mechanism", RFC 2965, October 2000.

   [RFC 2109] Kristol, D. and L. Montulli, "HTTP State Management
              Mechanism", RFC 2109, February 1997.








Moore & Freed            Best Current Practice                  [Page 7]

RFC 2964              Use of HTTP State Management          October 2000


7.  Full Copyright Statement

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Moore & Freed            Best Current Practice                  [Page 8]


Added doc/rfc2965.txt.




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                         D. Kristol
Request for Comments: 2965        Bell Laboratories, Lucent Technologies
Obsoletes: 2109                                              L. Montulli
Category: Standards Track                             Epinions.com, Inc.
                                                            October 2000


                    HTTP State Management Mechanism

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

IESG Note

   The IESG notes that this mechanism makes use of the .local top-level
   domain (TLD) internally when handling host names that don't contain
   any dots, and that this mechanism might not work in the expected way
   should an actual .local TLD ever be registered.

Abstract

   This document specifies a way to create a stateful session with
   Hypertext Transfer Protocol (HTTP) requests and responses.  It
   describes three new headers, Cookie, Cookie2, and Set-Cookie2, which
   carry state information between participating origin servers and user
   agents.  The method described here differs from Netscape's Cookie
   proposal [Netscape], but it can interoperate with HTTP/1.0 user
   agents that use Netscape's method.  (See the HISTORICAL section.)

   This document reflects implementation experience with RFC 2109 and
   obsoletes it.

1.  TERMINOLOGY

   The terms user agent, client, server, proxy, origin server, and
   http_URL have the same meaning as in the HTTP/1.1 specification
   [RFC2616].  The terms abs_path and absoluteURI have the same meaning
   as in the URI Syntax specification [RFC2396].




Kristol & Montulli          Standards Track                     [Page 1]

RFC 2965            HTTP State Management Mechanism         October 2000


   Host name (HN) means either the host domain name (HDN) or the numeric
   Internet Protocol (IP) address of a host.  The fully qualified domain
   name is preferred; use of numeric IP addresses is strongly
   discouraged.

   The terms request-host and request-URI refer to the values the client
   would send to the server as, respectively, the host (but not port)
   and abs_path portions of the absoluteURI (http_URL) of the HTTP
   request line.  Note that request-host is a HN.

   The term effective host name is related to host name.  If a host name
   contains no dots, the effective host name is that name with the
   string .local appended to it.  Otherwise the effective host name is
   the same as the host name.  Note that all effective host names
   contain at least one dot.

   The term request-port refers to the port portion of the absoluteURI
   (http_URL) of the HTTP request line.  If the absoluteURI has no
   explicit port, the request-port is the HTTP default, 80.  The
   request-port of a cookie is the request-port of the request in which
   a Set-Cookie2 response header was returned to the user agent.

   Host names can be specified either as an IP address or a HDN string.
   Sometimes we compare one host name with another.  (Such comparisons
   SHALL be case-insensitive.)  Host A's name domain-matches host B's if

      *  their host name strings string-compare equal; or

      * A is a HDN string and has the form NB, where N is a non-empty
         name string, B has the form .B', and B' is a HDN string.  (So,
         x.y.com domain-matches .Y.com but not Y.com.)

   Note that domain-match is not a commutative operation: a.b.c.com
   domain-matches .c.com, but not the reverse.

   The reach R of a host name H is defined as follows:

      *  If

         -  H is the host domain name of a host; and,

         -  H has the form A.B; and

         -  A has no embedded (that is, interior) dots; and

         -  B has at least one embedded dot, or B is the string "local".
            then the reach of H is .B.




Kristol & Montulli          Standards Track                     [Page 2]

RFC 2965            HTTP State Management Mechanism         October 2000


      *  Otherwise, the reach of H is H.

   For two strings that represent paths, P1 and P2, P1 path-matches P2
   if P2 is a prefix of P1 (including the case where P1 and P2 string-
   compare equal).  Thus, the string /tec/waldo path-matches /tec.

   Because it was used in Netscape's original implementation of state
   management, we will use the term cookie to refer to the state
   information that passes between an origin server and user agent, and
   that gets stored by the user agent.

1.1  Requirements

   The key words "MAY", "MUST", "MUST NOT", "OPTIONAL", "RECOMMENDED",
   "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT" in this
   document are to be interpreted as described in RFC 2119 [RFC2119].

2.  STATE AND SESSIONS

   This document describes a way to create stateful sessions with HTTP
   requests and responses.  Currently, HTTP servers respond to each
   client request without relating that request to previous or
   subsequent requests; the state management mechanism allows clients
   and servers that wish to exchange state information to place HTTP
   requests and responses within a larger context, which we term a
   "session".  This context might be used to create, for example, a
   "shopping cart", in which user selections can be aggregated before
   purchase, or a magazine browsing system, in which a user's previous
   reading affects which offerings are presented.

   Neither clients nor servers are required to support cookies.  A
   server MAY refuse to provide content to a client that does not return
   the cookies it sends.

3.  DESCRIPTION

   We describe here a way for an origin server to send state information
   to the user agent, and for the user agent to return the state
   information to the origin server.  The goal is to have a minimal
   impact on HTTP and user agents.

3.1  Syntax:  General

   The two state management headers, Set-Cookie2 and Cookie, have common
   syntactic properties involving attribute-value pairs.  The following
   grammar uses the notation, and tokens DIGIT (decimal digits), token





Kristol & Montulli          Standards Track                     [Page 3]

RFC 2965            HTTP State Management Mechanism         October 2000


   (informally, a sequence of non-special, non-white space characters),
   and http_URL from the HTTP/1.1 specification [RFC2616] to describe
   their syntax.

   av-pairs    =     av-pair *(";" av-pair)
   av-pair     =     attr ["=" value]              ; optional value
   attr        =     token
   value       =     token | quoted-string

   Attributes (names) (attr) are case-insensitive.  White space is
   permitted between tokens.  Note that while the above syntax
   description shows value as optional, most attrs require them.

   NOTE: The syntax above allows whitespace between the attribute and
   the = sign.

3.2  Origin Server Role

   3.2.1  General  The origin server initiates a session, if it so
   desires.  To do so, it returns an extra response header to the
   client, Set-Cookie2.  (The details follow later.)

   A user agent returns a Cookie request header (see below) to the
   origin server if it chooses to continue a session.  The origin server
   MAY ignore it or use it to determine the current state of the
   session.  It MAY send back to the client a Set-Cookie2 response
   header with the same or different information, or it MAY send no
   Set-Cookie2 header at all.  The origin server effectively ends a
   session by sending the client a Set-Cookie2 header with Max-Age=0.

   Servers MAY return Set-Cookie2 response headers with any response.
   User agents SHOULD send Cookie request headers, subject to other
   rules detailed below, with every request.

   An origin server MAY include multiple Set-Cookie2 headers in a
   response.  Note that an intervening gateway could fold multiple such
   headers into a single header.














Kristol & Montulli          Standards Track                     [Page 4]

RFC 2965            HTTP State Management Mechanism         October 2000


   3.2.2  Set-Cookie2 Syntax  The syntax for the Set-Cookie2 response
   header is

   set-cookie      =       "Set-Cookie2:" cookies
   cookies         =       1#cookie
   cookie          =       NAME "=" VALUE *(";" set-cookie-av)
   NAME            =       attr
   VALUE           =       value
   set-cookie-av   =       "Comment" "=" value
                   |       "CommentURL" "=" <"> http_URL <">
                   |       "Discard"
                   |       "Domain" "=" value
                   |       "Max-Age" "=" value
                   |       "Path" "=" value
                   |       "Port" [ "=" <"> portlist <"> ]
                   |       "Secure"
                   |       "Version" "=" 1*DIGIT
   portlist        =       1#portnum
   portnum         =       1*DIGIT

   Informally, the Set-Cookie2 response header comprises the token Set-
   Cookie2:, followed by a comma-separated list of one or more cookies.
   Each cookie begins with a NAME=VALUE pair, followed by zero or more
   semi-colon-separated attribute-value pairs.  The syntax for
   attribute-value pairs was shown earlier.  The specific attributes and
   the semantics of their values follows.  The NAME=VALUE attribute-
   value pair MUST come first in each cookie.  The others, if present,
   can occur in any order.  If an attribute appears more than once in a
   cookie, the client SHALL use only the value associated with the first
   appearance of the attribute; a client MUST ignore values after the
   first.

   The NAME of a cookie MAY be the same as one of the attributes in this
   specification.  However, because the cookie's NAME must come first in
   a Set-Cookie2 response header, the NAME and its VALUE cannot be
   confused with an attribute-value pair.

   NAME=VALUE
      REQUIRED.  The name of the state information ("cookie") is NAME,
      and its value is VALUE.  NAMEs that begin with $ are reserved and
      MUST NOT be used by applications.

      The VALUE is opaque to the user agent and may be anything the
      origin server chooses to send, possibly in a server-selected
      printable ASCII encoding.  "Opaque" implies that the content is of
      interest and relevance only to the origin server.  The content
      may, in fact, be readable by anyone that examines the Set-Cookie2
      header.



Kristol & Montulli          Standards Track                     [Page 5]

RFC 2965            HTTP State Management Mechanism         October 2000


   Comment=value
      OPTIONAL.  Because cookies can be used to derive or store private
      information about a user, the value of the Comment attribute
      allows an origin server to document how it intends to use the
      cookie.  The user can inspect the information to decide whether to
      initiate or continue a session with this cookie.  Characters in
      value MUST be in UTF-8 encoding. [RFC2279]

   CommentURL="http_URL"
      OPTIONAL.  Because cookies can be used to derive or store private
      information about a user, the CommentURL attribute allows an
      origin server to document how it intends to use the cookie.  The
      user can inspect the information identified by the URL to decide
      whether to initiate or continue a session with this cookie.

   Discard
      OPTIONAL.  The Discard attribute instructs the user agent to
      discard the cookie unconditionally when the user agent terminates.

   Domain=value
      OPTIONAL.  The value of the Domain attribute specifies the domain
      for which the cookie is valid.  If an explicitly specified value
      does not start with a dot, the user agent supplies a leading dot.

   Max-Age=value
      OPTIONAL.  The value of the Max-Age attribute is delta-seconds,
      the lifetime of the cookie in seconds, a decimal non-negative
      integer.  To handle cached cookies correctly, a client SHOULD
      calculate the age of the cookie according to the age calculation
      rules in the HTTP/1.1 specification [RFC2616].  When the age is
      greater than delta-seconds seconds, the client SHOULD discard the
      cookie.  A value of zero means the cookie SHOULD be discarded
      immediately.

   Path=value
      OPTIONAL.  The value of the Path attribute specifies the subset of
      URLs on the origin server to which this cookie applies.

   Port[="portlist"]
      OPTIONAL.  The Port attribute restricts the port to which a cookie
      may be returned in a Cookie request header.  Note that the syntax
      REQUIREs quotes around the OPTIONAL portlist even if there is only
      one portnum in portlist.








Kristol & Montulli          Standards Track                     [Page 6]

RFC 2965            HTTP State Management Mechanism         October 2000


   Secure
      OPTIONAL.  The Secure attribute (with no value) directs the user
      agent to use only (unspecified) secure means to contact the origin
      server whenever it sends back this cookie, to protect the
      confidentially and authenticity of the information in the cookie.

      The user agent (possibly with user interaction) MAY determine what
      level of security it considers appropriate for "secure" cookies.
      The Secure attribute should be considered security advice from the
      server to the user agent, indicating that it is in the session's
      interest to protect the cookie contents.  When it sends a "secure"
      cookie back to a server, the user agent SHOULD use no less than
      the same level of security as was used when it received the cookie
      from the server.

   Version=value
      REQUIRED.  The value of the Version attribute, a decimal integer,
      identifies the version of the state management specification to
      which the cookie conforms.  For this specification, Version=1
      applies.

   3.2.3  Controlling Caching  An origin server must be cognizant of the
   effect of possible caching of both the returned resource and the
   Set-Cookie2 header.  Caching "public" documents is desirable.  For
   example, if the origin server wants to use a public document such as
   a "front door" page as a sentinel to indicate the beginning of a
   session for which a Set-Cookie2 response header must be generated,
   the page SHOULD be stored in caches "pre-expired" so that the origin
   server will see further requests.  "Private documents", for example
   those that contain information strictly private to a session, SHOULD
   NOT be cached in shared caches.

   If the cookie is intended for use by a single user, the Set-Cookie2
   header SHOULD NOT be cached.  A Set-Cookie2 header that is intended
   to be shared by multiple users MAY be cached.

   The origin server SHOULD send the following additional HTTP/1.1
   response headers, depending on circumstances:

      *  To suppress caching of the Set-Cookie2 header:

         Cache-control: no-cache="set-cookie2"

   and one of the following:

      *  To suppress caching of a private document in shared caches:

         Cache-control: private



Kristol & Montulli          Standards Track                     [Page 7]

RFC 2965            HTTP State Management Mechanism         October 2000


      *  To allow caching of a document and require that it be validated
         before returning it to the client:

         Cache-Control: must-revalidate, max-age=0

      *  To allow caching of a document, but to require that proxy
         caches (not user agent caches) validate it before returning it
         to the client:

         Cache-Control: proxy-revalidate, max-age=0

      *  To allow caching of a document and request that it be validated
         before returning it to the client (by "pre-expiring" it):

         Cache-control: max-age=0

         Not all caches will revalidate the document in every case.

   HTTP/1.1 servers MUST send Expires: old-date (where old-date is a
   date long in the past) on responses containing Set-Cookie2 response
   headers unless they know for certain (by out of band means) that
   there are no HTTP/1.0 proxies in the response chain.  HTTP/1.1
   servers MAY send other Cache-Control directives that permit caching
   by HTTP/1.1 proxies in addition to the Expires: old-date directive;
   the Cache-Control directive will override the Expires: old-date for
   HTTP/1.1 proxies.

3.3  User Agent Role

   3.3.1  Interpreting Set-Cookie2  The user agent keeps separate track
   of state information that arrives via Set-Cookie2 response headers
   from each origin server (as distinguished by name or IP address and
   port).  The user agent MUST ignore attribute-value pairs whose
   attribute it does not recognize.  The user agent applies these
   defaults for optional attributes that are missing:

   Discard The default behavior is dictated by the presence or absence
           of a Max-Age attribute.

   Domain  Defaults to the effective request-host.  (Note that because
           there is no dot at the beginning of effective request-host,
           the default Domain can only domain-match itself.)

   Max-Age The default behavior is to discard the cookie when the user
           agent exits.

   Path    Defaults to the path of the request URL that generated the
           Set-Cookie2 response, up to and including the right-most /.



Kristol & Montulli          Standards Track                     [Page 8]

RFC 2965            HTTP State Management Mechanism         October 2000


   Port    The default behavior is that a cookie MAY be returned to any
           request-port.

   Secure  If absent, the user agent MAY send the cookie over an
           insecure channel.

   3.3.2  Rejecting Cookies  To prevent possible security or privacy
   violations, a user agent rejects a cookie according to rules below.
   The goal of the rules is to try to limit the set of servers for which
   a cookie is valid, based on the values of the Path, Domain, and Port
   attributes and the request-URI, request-host and request-port.

   A user agent rejects (SHALL NOT store its information) if the Version
   attribute is missing.  Moreover, a user agent rejects (SHALL NOT
   store its information) if any of the following is true of the
   attributes explicitly present in the Set-Cookie2 response header:

      *  The value for the Path attribute is not a prefix of the
         request-URI.

      *  The value for the Domain attribute contains no embedded dots,
         and the value is not .local.

      *  The effective host name that derives from the request-host does
         not domain-match the Domain attribute.

      *  The request-host is a HDN (not IP address) and has the form HD,
         where D is the value of the Domain attribute, and H is a string
         that contains one or more dots.

      *  The Port attribute has a "port-list", and the request-port was
         not in the list.

   Examples:

      *  A Set-Cookie2 from request-host y.x.foo.com for Domain=.foo.com
         would be rejected, because H is y.x and contains a dot.

      *  A Set-Cookie2 from request-host x.foo.com for Domain=.foo.com
         would be accepted.

      *  A Set-Cookie2 with Domain=.com or Domain=.com., will always be
         rejected, because there is no embedded dot.

      *  A Set-Cookie2 with Domain=ajax.com will be accepted, and the
         value for Domain will be taken to be .ajax.com, because a dot
         gets prepended to the value.




Kristol & Montulli          Standards Track                     [Page 9]

RFC 2965            HTTP State Management Mechanism         October 2000


      *  A Set-Cookie2 with Port="80,8000" will be accepted if the
         request was made to port 80 or 8000 and will be rejected
         otherwise.

      *  A Set-Cookie2 from request-host example for Domain=.local will
         be accepted, because the effective host name for the request-
         host is example.local, and example.local domain-matches .local.

   3.3.3  Cookie Management  If a user agent receives a Set-Cookie2
   response header whose NAME is the same as that of a cookie it has
   previously stored, the new cookie supersedes the old when: the old
   and new Domain attribute values compare equal, using a case-
   insensitive string-compare; and, the old and new Path attribute
   values string-compare equal (case-sensitive).  However, if the Set-
   Cookie2 has a value for Max-Age of zero, the (old and new) cookie is
   discarded.  Otherwise a cookie persists (resources permitting) until
   whichever happens first, then gets discarded: its Max-Age lifetime is
   exceeded; or, if the Discard attribute is set, the user agent
   terminates the session.

   Because user agents have finite space in which to store cookies, they
   MAY also discard older cookies to make space for newer ones, using,
   for example, a least-recently-used algorithm, along with constraints
   on the maximum number of cookies that each origin server may set.

   If a Set-Cookie2 response header includes a Comment attribute, the
   user agent SHOULD store that information in a human-readable form
   with the cookie and SHOULD display the comment text as part of a
   cookie inspection user interface.

   If a Set-Cookie2 response header includes a CommentURL attribute, the
   user agent SHOULD store that information in a human-readable form
   with the cookie, or, preferably, SHOULD allow the user to follow the
   http_URL link as part of a cookie inspection user interface.

   The cookie inspection user interface may include a facility whereby a
   user can decide, at the time the user agent receives the Set-Cookie2
   response header, whether or not to accept the cookie.  A potentially
   confusing situation could arise if the following sequence occurs:

      *  the user agent receives a cookie that contains a CommentURL
         attribute;

      *  the user agent's cookie inspection interface is configured so
         that it presents a dialog to the user before the user agent
         accepts the cookie;





Kristol & Montulli          Standards Track                    [Page 10]

RFC 2965            HTTP State Management Mechanism         October 2000


      *  the dialog allows the user to follow the CommentURL link when
         the user agent receives the cookie; and,

      *  when the user follows the CommentURL link, the origin server
         (or another server, via other links in the returned content)
         returns another cookie.

   The user agent SHOULD NOT send any cookies in this context.  The user
   agent MAY discard any cookie it receives in this context that the
   user has not, through some user agent mechanism, deemed acceptable.

   User agents SHOULD allow the user to control cookie destruction, but
   they MUST NOT extend the cookie's lifetime beyond that controlled by
   the Discard and Max-Age attributes.  An infrequently-used cookie may
   function as a "preferences file" for network applications, and a user
   may wish to keep it even if it is the least-recently-used cookie. One
   possible implementation would be an interface that allows the
   permanent storage of a cookie through a checkbox (or, conversely, its
   immediate destruction).

   Privacy considerations dictate that the user have considerable
   control over cookie management.  The PRIVACY section contains more
   information.

   3.3.4  Sending Cookies to the Origin Server  When it sends a request
   to an origin server, the user agent includes a Cookie request header
   if it has stored cookies that are applicable to the request, based on

      * the request-host and request-port;

      * the request-URI;

      * the cookie's age.

   The syntax for the header is:

cookie          =  "Cookie:" cookie-version 1*((";" | ",") cookie-value)
cookie-value    =  NAME "=" VALUE [";" path] [";" domain] [";" port]
cookie-version  =  "$Version" "=" value
NAME            =  attr
VALUE           =  value
path            =  "$Path" "=" value
domain          =  "$Domain" "=" value
port            =  "$Port" [ "=" <"> value <"> ]

   The value of the cookie-version attribute MUST be the value from the
   Version attribute of the corresponding Set-Cookie2 response header.
   Otherwise the value for cookie-version is 0.  The value for the path



Kristol & Montulli          Standards Track                    [Page 11]

RFC 2965            HTTP State Management Mechanism         October 2000


   attribute MUST be the value from the Path attribute, if one was
   present, of the corresponding Set-Cookie2 response header.  Otherwise
   the attribute SHOULD be omitted from the Cookie request header.  The
   value for the domain attribute MUST be the value from the Domain
   attribute, if one was present, of the corresponding Set-Cookie2
   response header.  Otherwise the attribute SHOULD be omitted from the
   Cookie request header.

   The port attribute of the Cookie request header MUST mirror the Port
   attribute, if one was present, in the corresponding Set-Cookie2
   response header.  That is, the port attribute MUST be present if the
   Port attribute was present in the Set-Cookie2 header, and it MUST
   have the same value, if any.  Otherwise, if the Port attribute was
   absent from the Set-Cookie2 header, the attribute likewise MUST be
   omitted from the Cookie request header.

   Note that there is neither a Comment nor a CommentURL attribute in
   the Cookie request header corresponding to the ones in the Set-
   Cookie2 response header.  The user agent does not return the comment
   information to the origin server.

   The user agent applies the following rules to choose applicable
   cookie-values to send in Cookie request headers from among all the
   cookies it has received.

   Domain Selection
      The origin server's effective host name MUST domain-match the
      Domain attribute of the cookie.

   Port Selection
      There are three possible behaviors, depending on the Port
      attribute in the Set-Cookie2 response header:

      1. By default (no Port attribute), the cookie MAY be sent to any
         port.

      2. If the attribute is present but has no value (e.g., Port), the
         cookie MUST only be sent to the request-port it was received
         from.

      3. If the attribute has a port-list, the cookie MUST only be
         returned if the new request-port is one of those listed in
         port-list.

   Path Selection
      The request-URI MUST path-match the Path attribute of the cookie.





Kristol & Montulli          Standards Track                    [Page 12]

RFC 2965            HTTP State Management Mechanism         October 2000


   Max-Age Selection
      Cookies that have expired should have been discarded and thus are
      not forwarded to an origin server.

   If multiple cookies satisfy the criteria above, they are ordered in
   the Cookie header such that those with more specific Path attributes
   precede those with less specific.  Ordering with respect to other
   attributes (e.g., Domain) is unspecified.

   Note: For backward compatibility, the separator in the Cookie header
   is semi-colon (;) everywhere.  A server SHOULD also accept comma (,)
   as the separator between cookie-values for future compatibility.

   3.3.5  Identifying What Version is Understood:  Cookie2  The Cookie2
   request header facilitates interoperation between clients and servers
   that understand different versions of the cookie specification.  When
   the client sends one or more cookies to an origin server, if at least
   one of those cookies contains a $Version attribute whose value is
   different from the version that the client understands, then the
   client MUST also send a Cookie2 request header, the syntax for which
   is

   cookie2 =       "Cookie2:" cookie-version

   Here the value for cookie-version is the highest version of cookie
   specification (currently 1) that the client understands.  The client
   needs to send at most one such request header per request.

   3.3.6  Sending Cookies in Unverifiable Transactions  Users MUST have
   control over sessions in order to ensure privacy.  (See PRIVACY
   section below.)  To simplify implementation and to prevent an
   additional layer of complexity where adequate safeguards exist,
   however, this document distinguishes between transactions that are
   verifiable and those that are unverifiable.  A transaction is
   verifiable if the user, or a user-designated agent, has the option to
   review the request-URI prior to its use in the transaction.  A
   transaction is unverifiable if the user does not have that option.
   Unverifiable transactions typically arise when a user agent
   automatically requests inlined or embedded entities or when it
   resolves redirection (3xx) responses from an origin server.
   Typically the origin transaction, the transaction that the user
   initiates, is verifiable, and that transaction may directly or
   indirectly induce the user agent to make unverifiable transactions.

   An unverifiable transaction is to a third-party host if its request-
   host U does not domain-match the reach R of the request-host O in the
   origin transaction.




Kristol & Montulli          Standards Track                    [Page 13]

RFC 2965            HTTP State Management Mechanism         October 2000


   When it makes an unverifiable transaction, a user agent MUST disable
   all cookie processing (i.e., MUST NOT send cookies, and MUST NOT
   accept any received cookies) if the transaction is to a third-party
   host.

   This restriction prevents a malicious service author from using
   unverifiable transactions to induce a user agent to start or continue
   a session with a server in a different domain.  The starting or
   continuation of such sessions could be contrary to the privacy
   expectations of the user, and could also be a security problem.

   User agents MAY offer configurable options that allow the user agent,
   or any autonomous programs that the user agent executes, to ignore
   the above rule, so long as these override options default to "off".

   (N.B.  Mechanisms may be proposed that will automate overriding the
   third-party restrictions under controlled conditions.)

   Many current user agents already provide a review option that would
   render many links verifiable.  For instance, some user agents display
   the URL that would be referenced for a particular link when the mouse
   pointer is placed over that link.  The user can therefore determine
   whether to visit that site before causing the browser to do so.
   (Though not implemented on current user agents, a similar technique
   could be used for a button used to submit a form -- the user agent
   could display the action to be taken if the user were to select that
   button.)  However, even this would not make all links verifiable; for
   example, links to automatically loaded images would not normally be
   subject to "mouse pointer" verification.

   Many user agents also provide the option for a user to view the HTML
   source of a document, or to save the source to an external file where
   it can be viewed by another application.  While such an option does
   provide a crude review mechanism, some users might not consider it
   acceptable for this purpose.

3.4  How an Origin Server Interprets the Cookie Header

   A user agent returns much of the information in the Set-Cookie2
   header to the origin server when the request-URI path-matches the
   Path attribute of the cookie.  When it receives a Cookie header, the
   origin server SHOULD treat cookies with NAMEs whose prefix is $
   specially, as an attribute for the cookie.








Kristol & Montulli          Standards Track                    [Page 14]

RFC 2965            HTTP State Management Mechanism         October 2000


3.5  Caching Proxy Role

   One reason for separating state information from both a URL and
   document content is to facilitate the scaling that caching permits.
   To support cookies, a caching proxy MUST obey these rules already in
   the HTTP specification:

      *  Honor requests from the cache, if possible, based on cache
         validity rules.

      *  Pass along a Cookie request header in any request that the
         proxy must make of another server.

      *  Return the response to the client.  Include any Set-Cookie2
         response header.

      *  Cache the received response subject to the control of the usual
         headers, such as Expires,

         Cache-control: no-cache

         and

         Cache-control: private

      *  Cache the Set-Cookie2 subject to the control of the usual
         header,

         Cache-control: no-cache="set-cookie2"

         (The Set-Cookie2 header should usually not be cached.)

   Proxies MUST NOT introduce Set-Cookie2 (Cookie) headers of their own
   in proxy responses (requests).

4.  EXAMPLES

4.1  Example 1

   Most detail of request and response headers has been omitted.  Assume
   the user agent has no stored cookies.

      1. User Agent -> Server

        POST /acme/login HTTP/1.1
        [form data]

        User identifies self via a form.



Kristol & Montulli          Standards Track                    [Page 15]

RFC 2965            HTTP State Management Mechanism         October 2000


      2. Server -> User Agent

        HTTP/1.1 200 OK
        Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"

        Cookie reflects user's identity.

      3. User Agent -> Server

        POST /acme/pickitem HTTP/1.1
        Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"
        [form data]

        User selects an item for "shopping basket".

      4. Server -> User Agent

        HTTP/1.1 200 OK
        Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
                Path="/acme"

        Shopping basket contains an item.

      5. User Agent -> Server

        POST /acme/shipping HTTP/1.1
        Cookie: $Version="1";
                Customer="WILE_E_COYOTE"; $Path="/acme";
                Part_Number="Rocket_Launcher_0001"; $Path="/acme"
        [form data]

        User selects shipping method from form.

      6. Server -> User Agent

        HTTP/1.1 200 OK
        Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme"

        New cookie reflects shipping method.

      7. User Agent -> Server

        POST /acme/process HTTP/1.1
        Cookie: $Version="1";
                Customer="WILE_E_COYOTE"; $Path="/acme";
                Part_Number="Rocket_Launcher_0001"; $Path="/acme";
                Shipping="FedEx"; $Path="/acme"
        [form data]



Kristol & Montulli          Standards Track                    [Page 16]

RFC 2965            HTTP State Management Mechanism         October 2000


        User chooses to process order.

      8. Server -> User Agent

        HTTP/1.1 200 OK

        Transaction is complete.

   The user agent makes a series of requests on the origin server, after
   each of which it receives a new cookie.  All the cookies have the
   same Path attribute and (default) domain.  Because the request-URIs
   all path-match /acme, the Path attribute of each cookie, each request
   contains all the cookies received so far.

4.2  Example 2

   This example illustrates the effect of the Path attribute.  All
   detail of request and response headers has been omitted.  Assume the
   user agent has no stored cookies.

   Imagine the user agent has received, in response to earlier requests,
   the response headers

   Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
           Path="/acme"

   and

   Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1";
           Path="/acme/ammo"

   A subsequent request by the user agent to the (same) server for URLs
   of the form /acme/ammo/...  would include the following request
   header:

   Cookie: $Version="1";
           Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo";
           Part_Number="Rocket_Launcher_0001"; $Path="/acme"

   Note that the NAME=VALUE pair for the cookie with the more specific
   Path attribute, /acme/ammo, comes before the one with the less
   specific Path attribute, /acme.  Further note that the same cookie
   name appears more than once.

   A subsequent request by the user agent to the (same) server for a URL
   of the form /acme/parts/ would include the following request header:





Kristol & Montulli          Standards Track                    [Page 17]

RFC 2965            HTTP State Management Mechanism         October 2000


   Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001";
   $Path="/acme"

   Here, the second cookie's Path attribute /acme/ammo is not a prefix
   of the request URL, /acme/parts/, so the cookie does not get
   forwarded to the server.

5.  IMPLEMENTATION CONSIDERATIONS

   Here we provide guidance on likely or desirable details for an origin
   server that implements state management.

5.1  Set-Cookie2 Content

   An origin server's content should probably be divided into disjoint
   application areas, some of which require the use of state
   information.  The application areas can be distinguished by their
   request URLs.  The Set-Cookie2 header can incorporate information
   about the application areas by setting the Path attribute for each
   one.

   The session information can obviously be clear or encoded text that
   describes state.  However, if it grows too large, it can become
   unwieldy.  Therefore, an implementor might choose for the session
   information to be a key to a server-side resource.  Of course, using
   a database creates some problems that this state management
   specification was meant to avoid, namely:

      1. keeping real state on the server side;

      2. how and when to garbage-collect the database entry, in case the
         user agent terminates the session by, for example, exiting.

5.2  Stateless Pages

   Caching benefits the scalability of WWW.  Therefore it is important
   to reduce the number of documents that have state embedded in them
   inherently.  For example, if a shopping-basket-style application
   always displays a user's current basket contents on each page, those
   pages cannot be cached, because each user's basket's contents would
   be different.  On the other hand, if each page contains just a link
   that allows the user to "Look at My Shopping Basket", the page can be
   cached.








Kristol & Montulli          Standards Track                    [Page 18]

RFC 2965            HTTP State Management Mechanism         October 2000


5.3  Implementation Limits

   Practical user agent implementations have limits on the number and
   size of cookies that they can store.  In general, user agents' cookie
   support should have no fixed limits.  They should strive to store as
   many frequently-used cookies as possible.  Furthermore, general-use
   user agents SHOULD provide each of the following minimum capabilities
   individually, although not necessarily simultaneously:

      *  at least 300 cookies

      *  at least 4096 bytes per cookie (as measured by the characters
         that comprise the cookie non-terminal in the syntax description
         of the Set-Cookie2 header, and as received in the Set-Cookie2
         header)

      *  at least 20 cookies per unique host or domain name

   User agents created for specific purposes or for limited-capacity
   devices SHOULD provide at least 20 cookies of 4096 bytes, to ensure
   that the user can interact with a session-based origin server.

   The information in a Set-Cookie2 response header MUST be retained in
   its entirety.  If for some reason there is inadequate space to store
   the cookie, it MUST be discarded, not truncated.

   Applications should use as few and as small cookies as possible, and
   they should cope gracefully with the loss of a cookie.

   5.3.1  Denial of Service Attacks  User agents MAY choose to set an
   upper bound on the number of cookies to be stored from a given host
   or domain name or on the size of the cookie information.  Otherwise a
   malicious server could attempt to flood a user agent with many
   cookies, or large cookies, on successive responses, which would force
   out cookies the user agent had received from other servers.  However,
   the minima specified above SHOULD still be supported.

6.  PRIVACY

   Informed consent should guide the design of systems that use cookies.
   A user should be able to find out how a web site plans to use
   information in a cookie and should be able to choose whether or not
   those policies are acceptable.  Both the user agent and the origin
   server must assist informed consent.







Kristol & Montulli          Standards Track                    [Page 19]

RFC 2965            HTTP State Management Mechanism         October 2000


6.1  User Agent Control

   An origin server could create a Set-Cookie2 header to track the path
   of a user through the server.  Users may object to this behavior as
   an intrusive accumulation of information, even if their identity is
   not evident.  (Identity might become evident, for example, if a user
   subsequently fills out a form that contains identifying information.)
   This state management specification therefore requires that a user
   agent give the user control over such a possible intrusion, although
   the interface through which the user is given this control is left
   unspecified.  However, the control mechanisms provided SHALL at least
   allow the user

      *  to completely disable the sending and saving of cookies.

      *  to determine whether a stateful session is in progress.

      *  to control the saving of a cookie on the basis of the cookie's
         Domain attribute.

   Such control could be provided, for example, by mechanisms

      *  to notify the user when the user agent is about to send a
         cookie to the origin server, to offer the option not to begin a
         session.

      * to display a visual indication that a stateful session is in
         progress.

      * to let the user decide which cookies, if any, should be saved
         when the user concludes a window or user agent session.

      * to let the user examine and delete the contents of a cookie at
         any time.

   A user agent usually begins execution with no remembered state
   information.  It SHOULD be possible to configure a user agent never
   to send Cookie headers, in which case it can never sustain state with
   an origin server.  (The user agent would then behave like one that is
   unaware of how to handle Set-Cookie2 response headers.)

   When the user agent terminates execution, it SHOULD let the user
   discard all state information.  Alternatively, the user agent MAY ask
   the user whether state information should be retained; the default
   should be "no".  If the user chooses to retain state information, it
   would be restored the next time the user agent runs.





Kristol & Montulli          Standards Track                    [Page 20]

RFC 2965            HTTP State Management Mechanism         October 2000


   NOTE: User agents should probably be cautious about using files to
   store cookies long-term.  If a user runs more than one instance of
   the user agent, the cookies could be commingled or otherwise
   corrupted.

6.2  Origin Server Role

   An origin server SHOULD promote informed consent by adding CommentURL
   or Comment information to the cookies it sends.  CommentURL is
   preferred because of the opportunity to provide richer information in
   a multiplicity of languages.

6.3  Clear Text

   The information in the Set-Cookie2 and Cookie headers is unprotected.
   As a consequence:

      1. Any sensitive information that is conveyed in them is exposed
         to intruders.

      2. A malicious intermediary could alter the headers as they travel
         in either direction, with unpredictable results.

   These facts imply that information of a personal and/or financial
   nature should only be sent over a secure channel.  For less sensitive
   information, or when the content of the header is a database key, an
   origin server should be vigilant to prevent a bad Cookie value from
   causing failures.

   A user agent in a shared user environment poses a further risk.
   Using a cookie inspection interface, User B could examine the
   contents of cookies that were saved when User A used the machine.

7.  SECURITY CONSIDERATIONS

7.1  Protocol Design

   The restrictions on the value of the Domain attribute, and the rules
   concerning unverifiable transactions, are meant to reduce the ways
   that cookies can "leak" to the "wrong" site.  The intent is to
   restrict cookies to one host, or a closely related set of hosts.
   Therefore a request-host is limited as to what values it can set for
   Domain.  We consider it acceptable for hosts host1.foo.com and
   host2.foo.com to share cookies, but not a.com and b.com.

   Similarly, a server can set a Path only for cookies that are related
   to the request-URI.




Kristol & Montulli          Standards Track                    [Page 21]

RFC 2965            HTTP State Management Mechanism         October 2000


7.2  Cookie Spoofing

   Proper application design can avoid spoofing attacks from related
   domains.  Consider:

      1. User agent makes request to victim.cracker.edu, gets back
         cookie session_id="1234" and sets the default domain
         victim.cracker.edu.

      2. User agent makes request to spoof.cracker.edu, gets back cookie
         session-id="1111", with Domain=".cracker.edu".

      3. User agent makes request to victim.cracker.edu again, and
         passes

         Cookie: $Version="1"; session_id="1234",
                 $Version="1"; session_id="1111"; $Domain=".cracker.edu"

         The server at victim.cracker.edu should detect that the second
         cookie was not one it originated by noticing that the Domain
         attribute is not for itself and ignore it.

7.3  Unexpected Cookie Sharing

   A user agent SHOULD make every attempt to prevent the sharing of
   session information between hosts that are in different domains.
   Embedded or inlined objects may cause particularly severe privacy
   problems if they can be used to share cookies between disparate
   hosts.  For example, a malicious server could embed cookie
   information for host a.com in a URI for a CGI on host b.com.  User
   agent implementors are strongly encouraged to prevent this sort of
   exchange whenever possible.

7.4  Cookies For Account Information

   While it is common practice to use them this way, cookies are not
   designed or intended to be used to hold authentication information,
   such as account names and passwords.  Unless such cookies are
   exchanged over an encrypted path, the account information they
   contain is highly vulnerable to perusal and theft.

8.  OTHER, SIMILAR, PROPOSALS

   Apart from RFC 2109, three other proposals have been made to
   accomplish similar goals.  This specification began as an amalgam of
   Kristol's State-Info proposal [DMK95] and Netscape's Cookie proposal
   [Netscape].




Kristol & Montulli          Standards Track                    [Page 22]

RFC 2965            HTTP State Management Mechanism         October 2000


   Brian Behlendorf proposed a Session-ID header that would be user-
   agent-initiated and could be used by an origin server to track
   "clicktrails".  It would not carry any origin-server-defined state,
   however.  Phillip Hallam-Baker has proposed another client-defined
   session ID mechanism for similar purposes.

   While both session IDs and cookies can provide a way to sustain
   stateful sessions, their intended purpose is different, and,
   consequently, the privacy requirements for them are different.  A
   user initiates session IDs to allow servers to track progress through
   them, or to distinguish multiple users on a shared machine.  Cookies
   are server-initiated, so the cookie mechanism described here gives
   users control over something that would otherwise take place without
   the users' awareness.  Furthermore, cookies convey rich, server-
   selected information, whereas session IDs comprise user-selected,
   simple information.

9.  HISTORICAL

9.1  Compatibility with Existing Implementations

   Existing cookie implementations, based on the Netscape specification,
   use the Set-Cookie (not Set-Cookie2) header.  User agents that
   receive in the same response both a Set-Cookie and Set-Cookie2
   response header for the same cookie MUST discard the Set-Cookie
   information and use only the Set-Cookie2 information.  Furthermore, a
   user agent MUST assume, if it received a Set-Cookie2 response header,
   that the sending server complies with this document and will
   understand Cookie request headers that also follow this
   specification.

   New cookies MUST replace both equivalent old- and new-style cookies.
   That is, if a user agent that follows both this specification and
   Netscape's original specification receives a Set-Cookie2 response
   header, and the NAME and the Domain and Path attributes match (per
   the Cookie Management section) a Netscape-style cookie, the
   Netscape-style cookie MUST be discarded, and the user agent MUST
   retain only the cookie adhering to this specification.

   Older user agents that do not understand this specification, but that
   do understand Netscape's original specification, will not recognize
   the Set-Cookie2 response header and will receive and send cookies
   according to the older specification.








Kristol & Montulli          Standards Track                    [Page 23]

RFC 2965            HTTP State Management Mechanism         October 2000


   A user agent that supports both this specification and Netscape-style
   cookies SHOULD send a Cookie request header that follows the older
   Netscape specification if it received the cookie in a Set-Cookie
   response header and not in a Set-Cookie2 response header.  However,
   it SHOULD send the following request header as well:

        Cookie2: $Version="1"

   The Cookie2 header advises the server that the user agent understands
   new-style cookies.  If the server understands new-style cookies, as
   well, it SHOULD continue the stateful session by sending a Set-
   Cookie2 response header, rather than Set-Cookie.  A server that does
   not understand new-style cookies will simply ignore the Cookie2
   request header.

9.2  Caching and HTTP/1.0

   Some caches, such as those conforming to HTTP/1.0, will inevitably
   cache the Set-Cookie2 and Set-Cookie headers, because there was no
   mechanism to suppress caching of headers prior to HTTP/1.1.  This
   caching can lead to security problems.  Documents transmitted by an
   origin server along with Set-Cookie2 and Set-Cookie headers usually
   either will be uncachable, or will be "pre-expired".  As long as
   caches obey instructions not to cache documents (following Expires:
   <a date in the past> or Pragma: no-cache (HTTP/1.0), or Cache-
   control:  no-cache (HTTP/1.1)) uncachable documents present no
   problem.  However, pre-expired documents may be stored in caches.
   They require validation (a conditional GET) on each new request, but
   some cache operators loosen the rules for their caches, and sometimes
   serve expired documents without first validating them.  This
   combination of factors can lead to cookies meant for one user later
   being sent to another user.  The Set-Cookie2 and Set-Cookie headers
   are stored in the cache, and, although the document is stale
   (expired), the cache returns the document in response to later
   requests, including cached headers.

10.  ACKNOWLEDGEMENTS

   This document really represents the collective efforts of the HTTP
   Working Group of the IETF and, particularly, the following people, in
   addition to the authors: Roy Fielding, Yaron Goland, Marc Hedlund,
   Ted Hardie, Koen Holtman, Shel Kaphan, Rohit Khare, Foteos Macrides,
   David W. Morris.








Kristol & Montulli          Standards Track                    [Page 24]

RFC 2965            HTTP State Management Mechanism         October 2000


11.  AUTHORS' ADDRESSES

   David M. Kristol
   Bell Laboratories, Lucent Technologies
   600 Mountain Ave.  Room 2A-333
   Murray Hill, NJ  07974

   Phone: (908) 582-2250
   Fax: (908) 582-1239
   EMail: dmk@bell-labs.com


   Lou Montulli
   Epinions.com, Inc.
   2037 Landings Dr.
   Mountain View, CA  94301

   EMail: lou@montulli.org

12.  REFERENCES

   [DMK95]    Kristol, D.M., "Proposed HTTP State-Info Mechanism",
              available at <http://portal.research.bell-
              labs.com/~dmk/state-info.html>, September, 1995.

   [Netscape] "Persistent Client State -- HTTP Cookies", available at
              <http://www.netscape.com/newsref/std/cookie_spec.html>,
              undated.

   [RFC2109]  Kristol, D. and L. Montulli, "HTTP State Management
              Mechanism", RFC 2109, February 1997.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2279]  Yergeau, F., "UTF-8, a transformation format of Unicode
              and ISO-10646", RFC 2279, January 1998.

   [RFC2396]  Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform
              Resource Identifiers (URI): Generic Syntax", RFC 2396,
              August 1998.

   [RFC2616]  Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T.
              Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1",
              RFC 2616, June 1999.






Kristol & Montulli          Standards Track                    [Page 25]

RFC 2965            HTTP State Management Mechanism         October 2000


13.  Full Copyright Statement

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Kristol & Montulli          Standards Track                    [Page 26]


Added doc/rfc3143.txt.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                          I. Cooper
Request for Comments: 3143                                 Equinix, Inc.
Category: Informational                                        J. Dilley
                                               Akamai Technologies, Inc.
                                                               June 2001


                   Known HTTP Proxy/Caching Problems

Status of this Memo

   This memo provides information for the Internet community.  It does
   not specify an Internet standard of any kind.  Distribution of this
   memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2001).  All Rights Reserved.

Abstract

   This document catalogs a number of known problems with World Wide Web
   (WWW) (caching) proxies and cache servers.  The goal of the document
   is to provide a discussion of the problems and proposed workarounds,
   and ultimately to improve conditions by illustrating problems.  The
   construction of this document is a joint effort of the Web caching
   community.

Table of Contents

   1.    Introduction . . . . . . . . . . . . . . . . . . . . . . . .  2
   1.1   Problem Template . . . . . . . . . . . . . . . . . . . . . .  2
   2.    Known Problems . . . . . . . . . . . . . . . . . . . . . . .  4
   2.1   Known Specification Problems . . . . . . . . . . . . . . . .  5
   2.1.1 Vary header is underspecified and/or misleading  . . . . . .  5
   2.1.2 Client Chaining Loses Valuable Length Meta-Data  . . . . . .  9
   2.2   Known Architectural Problems . . . . . . . . . . . . . . . . 10
   2.2.1 Interception proxies break client cache directives . . . . . 10
   2.2.2 Interception proxies prevent introduction of new HTTP
            methods  . . . . . . . . . . . . . . . . . . . . . . . .  11
   2.2.3 Interception proxies break IP address-based authentication . 12
   2.2.4 Caching proxy peer selection in heterogeneous networks . . . 13
   2.2.5 ICP Performance  . . . . . . . . . . . . . . . . . . . . . . 15
   2.2.6 Caching proxy meshes can break HTTP serialization of content 16
   2.3   Known Implementation Problems  . . . . . . . . . . . . . . . 17
   2.3.1 User agent/proxy failover  . . . . . . . . . . . . . . . . . 17
   2.3.2 Some servers send bad Content-Length headers for files that
            contain CR . . . . . . . . . . . . . . . . . . . . . . .  18



Cooper & Dilley              Informational                      [Page 1]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   3.    Security Considerations  . . . . . . . . . . . . . . . . . . 18
         References . . . . . . . . . . . . . . . . . . . . . . . . . 19
         Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 20
   A.    Archived Known Problems  . . . . . . . . . . . . . . . . . . 21
   A.1   Architectural  . . . . . . . . . . . . . . . . . . . . . . . 21
   A.1.1 Cannot specify multiple URIs for replicated resources  . . . 21
   A.1.2 Replica distance is unknown  . . . . . . . . . . . . . . . . 22
   A.1.3 Proxy resource location  . . . . . . . . . . . . . . . . . . 23
   A.2   Implementation . . . . . . . . . . . . . . . . . . . . . . . 23
   A.2.1 Use of Cache-Control headers . . . . . . . . . . . . . . . . 23
   A.2.2 Lack of HTTP/1.1 compliance for caching proxies  . . . . . . 24
   A.2.3 ETag support . . . . . . . . . . . . . . . . . . . . . . . . 25
   A.2.4 Servers and content should be optimized for caching  . . . . 26
   A.3   Administration . . . . . . . . . . . . . . . . . . . . . . . 27
   A.3.1 Lack of fine-grained, standardized hierarchy controls  . . . 27
   A.3.2 Proxy/Server exhaustive log format standard for analysis . . 27
   A.3.3 Trace log timestamps . . . . . . . . . . . . . . . . . . . . 28
   A.3.4 Exchange format for log summaries  . . . . . . . . . . . . . 29
         Full Copyright Statement . . . . . . . . . . . . . . . . . . 32

1. Introduction

   This memo discusses problems with proxies - which act as
   application-level intermediaries for Web requests - and more
   specifically with caching proxies, which retain copies of previously
   requested resources in the hope of improving overall quality of
   service by serving the content locally.  Commonly used terminology in
   this memo can be found in the "Internet Web Replication and Caching
   Taxonomy"[2].

   No individual or organization has complete knowledge of the known
   problems in Web caching, and the editors are grateful to the
   contributors to this document.

1.1 Problem Template

   A common problem template is used within the following sections.  We
   gratefully acknowledge RFC2525 [1] which helped define an initial
   format for this known problems list.  The template format is
   summarized in the following table and described in more detail below.

      Name:           short, descriptive name of the problem (3-5 words)
      Classification: classifies the problem: performance, security, etc
      Description:    describes the problem succinctly
      Significance:   magnitude of problem, environments where it exists
      Implications:   the impact of the problem on systems and networks
      See Also:       a reference to a related known problem
      Indications:    states how to detect the presence of this problem



Cooper & Dilley              Informational                      [Page 2]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      Solution(s):    describe the solution(s) to this problem, if any
      Workaround:     practical workaround for the problem
      References:     information about the problem or solution
      Contact:        contact name and email address for this section

   Name
      A short, descriptive, name (3-5 words) name associated with the
      problem.

   Classification
      Problems are grouped into categories of similar problems for ease
      of reading of this memo.  Choose the category that best describes
      the problem.  The suggested categories include three general
      categories and several more specific categories.

      *  Architecture: the fundamental design is incomplete, or
         incorrect

      *  Specification: the spec is ambiguous, incomplete, or incorrect.

      *  Implementation: the implementation of the spec is incorrect.

      *  Performance: perceived page response at the client is
         excessive; network bandwidth consumption is excessive; demand
         on origin or proxy servers exceed reasonable bounds.

      *  Administration: care and feeding of caches is, or causes, a
         problem.

      *  Security: privacy, integrity, or authentication concerns.

   Description
      A definition of the problem, succinct but including necessary
      background information.

   Significance (High, Medium, Low)
      May include a brief summary of the environments for which the
      problem is significant.

   Implications
      Why the problem is viewed as a problem.  What inappropriate
      behavior results from it? This section should substantiate the
      magnitude of any problem indicated with High significance.

   See Also
      Optional.  List of other known problems that are related to this
      one.




Cooper & Dilley              Informational                      [Page 3]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Indications
      How to detect the presence of the problem.  This may include
      references to one or more substantiating documents that
      demonstrate the problem.  This should include the network
      configuration that led to the problem such that it can be
      reproduced.  Problems that are not reproducible will not appear in
      this memo.

   Solution(s)
      Solutions that permanently fix the problem, if such are known. For
      example, what version of the software does not exhibit the
      problem?  Indicate if the solution is accepted by the community,
      one of several solutions pending agreement, or open possibly with
      experimental solutions.

   Workaround
      Practical workaround if no solution is available or usable.  The
      workaround should have sufficient detail for someone experiencing
      the problem to get around it.

   References
      References to related information in technical publications or on
      the web.  Where can someone interested in learning more go to find
      out more about this problem, its solution, or workarounds?

   Contact
      Contact name and email address of the person who supplied the
      information for this section.  The editors are listed as contacts
      for anonymous submissions.

2. Known Problems

   The remaining sections of this document present the currently
   documented known problems.  The problems are ordered by
   classification and significance.  Issues with protocol specification
   or architecture are first, followed by implementation issues.  Issues
   of high significance are first, followed by lower significance.

   Some of the problems initially identified in the previous versions of
   this document have been moved to Appendix A since they discuss issues
   where resolution primarily involves education rather than protocol
   work.

   A full list of the problems is available in the table of contents.







Cooper & Dilley              Informational                      [Page 4]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


2.1 Known Specification Problems

2.1.1 Vary header is underspecified and/or misleading

   Name
      The "Vary" header is underspecified and/or misleading

   Classification
      Specification

   Description
      The Vary header in HTTP/1.1 was designed to allow a caching proxy
      to safely cache responses even if the server's choice of variants
      is not entirely understood.  As RFC 2616 says:

         The Vary header field can be used to express the parameters the
         server uses to select a representation that is subject to
         server-driven negotiation.

      One might expect that this mechanism is useful in general for
      extensions that change the response message based on some aspects
      of the request.  However, that is not true.

      During the design of the HTTP delta encoding specification[9] it
      was realized that an HTTP/1.1 proxy that does not understand delta
      encoding might cache a delta-encoded response and then later
      deliver it to a non-delta-capable client, unless the extension
      included some mechanism to prevent this.  Initially, it was
      thought that Vary would suffice, but the following scenario proves
      this wrong.

      NOTE: It is likely that other scenarios exhibiting the same basic
      problem with "Vary" could be devised, without reference to delta
      encoding.  This is simply a concrete scenario used to explain the
      problem.

      A complete description of the IM and A-IM headers may be found in
      the "Delta encoding in HTTP" specification.  For the purpose of
      this problem description, the relevant details are:

      1. The concept of an "instance manipulation" is introduced.  In
         some ways, this is similar to a content-coding, but there are
         differences.  One example of an instance manipulation name is
         "vcdiff".

      2. A client signals its willingness to accept one or more
         instance-manipulations using the A-IM header.




Cooper & Dilley              Informational                      [Page 5]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      3. A server indicates which instance-manipulations are used to
         encode the body of a response using the IM header.

      4. Existing implementations will ignore the A-IM and IM headers,
         following the usual HTTP rules for handling unknown headers.

      5. Responses encoded with an instance-manipulation are sent using
         the (proposed) 226 status code, "IM Used".

      6. In response to a conditional request that carries an IM header,
         if the request-URI has been modified then a server may transmit
         a compact encoding of the modifications using a delta-encoding
         instead of a status-200 response.  The encoded response cannot
         be understood by an implementation that does not support delta
         encodings.

      This summary omits many details.

      Suppose client A sends this request via proxy P:

         GET http://example.com/foo.html HTTP/1.1
         Host: example.com
         If-None-Match: "abc"
         A-IM: vcdiff

      and the origin server returns, via P, this response:

         HTTP/1.1 226 IM Used
         Etag: "def"
         Date: Wed, 19 Apr 2000 18:46:13 GMT
         IM: vcdiff
         Cache-Control: max-age-60
         Vary: A-IM, If-None-Match

      the body of which is a delta-encoded response (it encodes the
      difference between the Etag "abc" instance of foo.html, and the
      "def" instance).  Assume that P stores this response in its cache,
      and that P does not understand the vcdiff encoding.

      Later, client B, also ignorant of delta-encoding, sends this
      request via P:

         GET http://example.com/foo.html HTTP/1.1
         Host: example.com

      What can P do now?  According to the specification for the Vary
      header in RFC2616,




Cooper & Dilley              Informational                      [Page 6]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


         The Vary field value indicates the set of request-header fields
         that fully determines, while the response is fresh, whether a
         cache is permitted to use the response to reply to a subsequent
         request without revalidation.

      Implicitly, however, the cache would be allowed to use the stored
      response in response to client B WITH "revalidation".  This is the
      potential bug.

      An obvious implementation of the proxy would send this request to
      test whether its cache entry is fresh (i.e., to revalidate the
      entry):

         GET /foo.html HTTP/1.1
         Host: example.com
         If-None-Match: "def"

      That is, the proxy simply forwards the new request, after doing
      the usual transformation on the URL and tacking on the "obvious"
      If-None-Match header.

      If the origin server's Etag for the current instance is still
      "def", it would naturally respond:

         HTTP/1.1 304 Not Modified
         Etag: "def"
         Date: Wed, 19 Apr 2000 18:46:14 GMT

      thus telling the proxy P that it can use its stored response.  But
      this cache response actually involves a delta-encoding that would
      not be sensible to client B, signaled by a header field that would
      be ignored by B, and so the client displays garbage.

      The problem here is that the original request (from client A)
      generated a response that is not sensible to client B, not merely
      one that is not "the appropriate representation" (as the result of
      server-driven negotiation).

      One might argue that the proxy P shouldn't be storing status-226
      responses in the first place.  True in theory, perhaps, but
      unfortunately RFC2616, section 13.4, says:

         A response received with any [status code other than 200, 203,
         206, 300, 301 or 410] MUST NOT be returned in a reply to a
         subsequent request unless there are cache-control directives or
         another header(s) that explicitly allow it.  For example, these





Cooper & Dilley              Informational                      [Page 7]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


         include the following: an Expires header (section 14.21); a
         "max-age", "s-maxage", "must-revalidate", "proxy-revalidate",
         "public" or "private" cache-control directive (section 14.9).

      In other words, the specification allows caching of responses with
      yet-to-be-defined status codes if the response carries a plausible
      Cache-Control directive.  So unless we ban servers implementing
      this kind of extension from using these Cache-Control directives
      at all, the Vary header just won't work.

   Significance
      Medium

   Implications
      Certain plausible extensions to the HTTP/1.1 protocol might not
      interoperate correctly with older HTTP/1.1 caches, if the
      extensions depend on an interpretation of Vary that is not the
      same as is used by the cache implementer.

      This would have the effect either of causing hard-to-debug cache
      transparency failures, or of discouraging the deployment of such
      extensions, or of encouraging the implementers of such extensions
      to disable caching entirely.

   Indications
      The problem is visible when hand-simulating plausible message
      exchanges, especially when using the proposed delta encoding
      extension.  It probably has not been visible in practice yet.

   Solution(s)

      1. Section 13.4 of the HTTP/1.1 specification should probably be
         changed to prohibit caching of responses with status codes that
         the cache doesn't understand, whether or not they include
         Expires headers and the like.  (It might require some care to
         define what "understands" means, leaving room for future
         extensions with new status codes.)  The behavior in this case
         needs to be defined as equivalent to "Cache-Control:  no-store"
         rather than "no-cache", since the latter allows revalidation.

         Possibly the specification of Vary should require that it be
         treated as "Cache-Control:  no-store" whenever the status code
         is unknown - that should solve the problem in the scenario
         given here.







Cooper & Dilley              Informational                      [Page 8]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      2. Designers of HTTP/1.1 extensions should consider using
         mechanisms other than Vary to prevent false caching.

         It is not clear whether the Vary mechanism is widely
         implemented in caches; if not, this favors solution #1.

   Workaround
      A cache could treat the presence of a Vary header in a response as
      an implicit "Cache-control: no-store", except for "known" status
      codes, even though this is not required by RFC 2616.  This would
      avoid any transparency failures.  "Known status codes" for basic
      HTTP/1.1 caches probably include: 200, 203, 206, 300, 301, 410
      (although this list should be re-evaluated in light of the problem
      discussed here).

   References
      See [9] for the specification of the delta encoding extension, as
      well as for an example of the use of a Cache-Control extension
      instead of "Vary."

   Contact
      Jeff Mogul <mogul@pa.dec.com>

2.1.2 Client Chaining Loses Valuable Length Meta-Data

   Name
      Client Chaining Loses Valuable Length Meta-Data

   Classification
      Performance

   Description
      HTTP/1.1[3] implementations are prohibited from sending Content-
      Length headers with any message whose body has been Transfer-
      Encoded.  Because 1.0 clients cannot accept chunked Transfer-
      Encodings, receiving 1.1 implementations must forward the body to
      1.0 clients must do so without the benefit of information that was
      discarded earlier in the chain.

   Significance
      Low

   Implications
      Lacking either a chunked transfer encoding or Content-Length
      indication creates negative performance implications for how the
      proxy must forward the message body.





Cooper & Dilley              Informational                      [Page 9]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      In the case of response bodies, the server may either forward the
      response while closing the connection to indicate the end of the
      response or must utilize store and forward semantics to buffer the
      entire response in order to calculate a Content-Length.  The
      former option defeats the performance benefits of persistent
      connections in HTTP/1.1 (and their Keep-Alive cousin in HTTP/1.0)
      as well as creating some ambiguously lengthed responses.  The
      latter store and forward option may not even be feasible given the
      size of the resource and it will always introduce increased
      latency.

      Request bodies must undertake the store and forward process as 1.0
      request bodies must be delimited by Content-Length headers.  As
      with response bodies this may place unacceptable resource
      constraints on the proxy and the request may not be able to be
      satisfied.

   Indications
      The lack of HTTP/1.0 style persistent connections between 1.0
      clients and 1.1 proxies, only when accessing 1.1 servers, is a
      strong indication of this problem.

   Solution(s)
      An HTTP specification clarification that would allow origin known
      identity document Content-Lengths to be carried end to end would
      alleviate this issue.

   Workaround
      None.

   Contact
      Patrick McManus <mcmanus@AppliedTheory.com>

2.2 Known Architectural Problems

2.2.1 Interception proxies break client cache directives

   Name
      Interception proxies break client cache directives

   Classification
      Architecture

   Description
      HTTP[3] is designed for the user agent to be aware if it is
      connected to an origin server or to a proxy.  User agents
      believing they are transacting with an origin server but which are




Cooper & Dilley              Informational                     [Page 10]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      really in a connection with an interception proxy may fail to send
      critical cache-control information they would have otherwise
      included in their request.

   Significance
      High

   Implications
      Clients may receive data that is not synchronized with the origin
      even when they request an end to end refresh, because of the lack
      of inclusion of either a "Cache-control: no-cache" or "must-
      revalidate" header.  These headers have no impact on origin server
      behavior so may not be included by the browser if it believes it
      is connected to that resource.  Other related data implications
      are possible as well.  For instance, data security may be
      compromised by the lack of inclusion of "private" or "no-store"
      clauses of the Cache-control header under similar conditions.

   Indications
      Easily detected by placing fresh (un-expired) content on a caching
      proxy while changing the authoritative copy, then requesting an
      end-to-end reload of the data through a proxy in both interception
      and explicit modes.

   Solution(s)
      Eliminate the need for interception proxies and IP spoofing, which
      will return correct context awareness to the client.

   Workaround
      Include relevant Cache-Control directives in every request at the
      cost of increased bandwidth and CPU requirements.

   Contact
      Patrick McManus <mcmanus@AppliedTheory.com>

2.2.2 Interception proxies prevent introduction of new HTTP methods

   Name
      Interception proxies prevent introduction of new HTTP methods

   Classification
      Architecture

   Description
      A proxy that receives a request with a method unknown to it is
      required to generate an HTTP 501 Error as a response.  HTTP
      methods are designed to be extensible so there may be applications
      deployed with initial support just for the user agent and origin



Cooper & Dilley              Informational                     [Page 11]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      server.  An interception proxy that hijacks requests which include
      new methods destined for servers that have implemented those
      methods creates a de-facto firewall where none may be intended.

   Significance
      Medium within interception proxy environments.

   Implications
      Renders new compliant applications useless unless modifications
      are made to proxy software.  Because new methods are not required
      to be globally standardized it is impossible to keep up to date in
      the general case.

   Solution(s)
      Eliminate the need for interception proxies.  A client receiving a
      501 in a traditional HTTP environment may either choose to repeat
      the request to the origin server directly, or perhaps be
      configured to use a different proxy.

   Workaround
      Level 5 switches (sometimes called Level 7 or application layer
      switches) can be used to keep HTTP traffic with unknown methods
      out of the proxy.  However, these devices have heavy buffering
      responsibilities, still require TCP sequence number spoofing, and
      do not interact well with persistent connections.

      The HTTP/1.1 specification allows a proxy to switch over to tunnel
      mode when it receives a request with a method or HTTP version it
      does not understand how to handle.

   Contact
      Patrick McManus <mcmanus@AppliedTheory.com>
      Henrik Nordstrom <hno@hem.passagen.se> (HTTP/1.1 clarification)

2.2.3 Interception proxies break IP address-based authentication

   Name
      Interception proxies break IP address-based authentication

   Classification
      Architecture

   Description
      Some web servers are not open for public access, but restrict
      themselves to accept only requests from certain IP address ranges
      for security reasons.  Interception proxies alter the source
      (client) IP addresses to that of the proxy itself, without the




Cooper & Dilley              Informational                     [Page 12]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      knowledge of the client/user.  This breaks such authentication
      mechanisms and prohibits otherwise allowed clients access to the
      servers.

   Significance
      Medium

   Implications
      Creates end user confusion and frustration.

   Indications
      Users  may start to see refused connections to servers after
      interception proxies are deployed.

   Solution(s)
      Use user-based authentication instead of (IP) address-based
      authentication.

   Workaround
      Using IP filters at the intercepting device (L4 switch) and bypass
      all requests to such servers concerned.

   Contact
      Keith K. Chau <keithc@unitechnetworks.com>

2.2.4 Caching proxy peer selection in heterogeneous networks

   Name
      Caching proxy peer selection in heterogeneous networks

   Classification
      Architecture

   Description
      ICP[4] based caching proxy peer selection in networks with large
      variance in latency and bandwidth between peers can lead to non-
      optimal peer selection.  For example take Proxy C with two
      siblings, Sib1 and Sib2, and the following network topology
      (summarized).

      *  Cache C's link to Sib1, 2 Mbit/sec with 300 msec latency

      *  Cache C's link to Sib2, 64 Kbit/sec with 10 msec latency.

      ICP[4] does not work well in this context.  If a user submits a
      request to Proxy C for page P that results in a miss, C will send
      an ICP request to Sib1 and Sib2.  Assume both siblings have the




Cooper & Dilley              Informational                     [Page 13]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


      requested object P.  The ICP_HIT reply will always come from Sib2
      before Sib1.  However, it is clear that the retrieval of large
      objects will be faster from Sib1, rather than Sib2.

      The problem is more complex because Sib1 and Sib2 can't have a
      100% hit ratio.  With a hit rate of 10%, it is more efficient to
      use Sib1 with resources larger than 48K.  The best choice depends
      on at least the hit rate and link characteristics; maybe other
      parameters as well.

   Significance
      Medium

   Implications
      By using the first peer to respond, peer selection algorithms are
      not optimizing retrieval latency to end users.  Furthermore they
      are causing more work for the high-latency peer since it must
      respond to such requests but will never be chosen to serve content
      if the lower latency peer has a copy.

   Indications
      Inherent in design of ICP v1, ICP v2, and any cache mesh protocol
      that selects peers based upon first response.

      This problem is not exhibited by cache digest or other protocols
      which (attempt to) maintain knowledge of peer contents and only
      hit peers that are believed to have a copy of the requested page.

   Solution(s)
      This problem is architectural with the peer selection protocols.

   Workaround
      Cache mesh design when using such a protocol should be done in
      such a way that there is not a high latency variance among peers.
      In the example presented in the above description the high latency
      high bandwidth peer could be used as a parent, but should not be
      used as a sibling.

   Contact
      Ivan Lovric <ivan.lovric@cnet.francetelecom.fr>
      John Dilley <jad@akamai.com>










Cooper & Dilley              Informational                     [Page 14]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


2.2.5 ICP Performance

   Name
      ICP performance

   Classification
      Architecture(ICP), Performance

   Description
      ICP[4] exhibits O(n^2) scaling properties, where n is the number
      of participating peer proxies.  This can lead ICP traffic to
      dominate HTTP traffic within a network.

   Significance
      Medium

   Implications
      If a proxy has many ICP peers the bandwidth demand of ICP can be
      excessive.  System managers must carefully regulate ICP peering.
      ICP also leads proxies to become homogeneous in what they serve;
      if your proxy does not have a document it is unlikely your peers
      will have it either.  Therefore, ICP traffic requests are largely
      unable to locate a local copy of an object (see [6]).

   Indications
      Inherent in design of ICP v1, ICP v2.

   Solution(s)
      This problem is architectural - protocol redesign or replacement
      is required to solve it if ICP is to continue to be used.

   Workaround
      Implementation workarounds exist, for example to turn off use of
      ICP, to carefully regulate peering, or to use another mechanism if
      available, such as cache digests.  A cache digest protocol shares
      a summary of cache contents using a Bloom Filter technique.  This
      allows a cache to estimate whether a peer has a document.  Filters
      are updated regularly but are not always up-to-date so cannot help
      when a spike in popularity occurs.  They also increase traffic but
      not as much as ICP.

      Proxy clustering protocols organize proxies into a mesh provide
      another alternative solution.  There is ongoing research on this
      topic.

   Contact
      John Dilley <jad@akamai.com>




Cooper & Dilley              Informational                     [Page 15]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


2.2.6 Caching proxy meshes can break HTTP serialization of content

   Name
      Caching proxy meshes can break HTTP serialization of content

   Classification
      Architecture (HTTP protocol)

   Description
      A caching proxy mesh where a request may travel different paths,
      depending on the state of the mesh and associated caches, can
      break HTTP content serialization, possibly causing the end user to
      receive older content than seen on an earlier request, where the
      request traversed another path in the mesh.

   Significance
      Medium

   Implications
      Can cause end user confusion.  May in some situations (sibling
      cache hit, object has changed state from cacheable to uncacheable)
      be close to impossible to get the caches properly updated with the
      new content.

   Indications
      Older content is unexpectedly returned from a caching proxy mesh
      after some time.

   Solutions(s)
      Work with caching proxy vendors and researchers to find a suitable
      protocol for maintaining proxy relations and object state in a
      mesh.

   Workaround
      When designing a hierarchy/mesh, make sure that for each end-
      user/URL combination there is only one single path in the mesh
      during normal operation.

   Contact
      Henrik Nordstrom <hno@hem.passagen.se>











Cooper & Dilley              Informational                     [Page 16]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


2.3 Known Implementation Problems

2.3.1 User agent/proxy failover

   Name
      User agent/proxy failover

   Classification
      Implementation

   Description
      Failover between proxies at the user agent (using a proxy.pac[8]
      file) is erratic and no standard behavior is defined.
      Additionally, behavior is hard-coded into the browser, so that
      proxy administrators cannot use failover at the user agent
      effectively.

   Significance
      Medium

   Implications
      Architects are forced to implement failover at the proxy itself,
      when it may be more appropriate and economical to do it within the
      user agent.

   Indications
      If a browser detects that its primary proxy is down, it will wait
      n minutes before trying the next one it is configured to use.  It
      will then wait y minutes before asking the user if they'd like to
      try the original proxy again.  This is very confusing for end
      users.

   Solution(s)
      Work with browser vendors to establish standard extensions to
      JavaScript proxy.pac libraries that will allow configuration of
      these timeouts.

   Workaround
      User education; redundancy at the proxy level.

   Contact
      Mark Nottingham <mnot@mnot.net>









Cooper & Dilley              Informational                     [Page 17]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


2.3.2 Some servers send bad Content-Length headers for files that
      contain CR

   Name
      Some servers send bad Content-Length headers for files that
      contain CR

   Classification
      Implementation

   Description
      Certain web servers send a Content-length value that is larger
      than number of bytes in the HTTP message body.  This happens when
      the server strips off CR characters from text files with lines
      terminated with CRLF as the file is written to the client.  The
      server probably uses the stat() system call to get the file size
      for the Content-Length header.  Servers that exhibit this behavior
      include the GN Web server (version 2.14 at least).

   Significance
      Low.  Surveys indicate only a small number of sites run faulty
      servers.

   Implications
      In this case, an HTTP client (e.g., user agent or proxy) may
      believe it received a partial response.  HTTP/1.1 [3] advises that
      caches MAY store partial responses.

   Indications
      Count the number of bytes in the message body and compare to the
      Content-length value.  If they differ the server exhibits this
      problem.

   Solutions
      Upgrade or replace the buggy server.

   Workaround
      Some browsers and proxies use one TCP connection per object and
      ignore the Content-Length.  The document end of file is identified
      by the close of the TCP socket.

   Contact
      Duane Wessels <wessels@measurement-factory.com>

3. Security Considerations

   This memo does not raise security considerations in itself.  See the
   individual submissions for details of security concerns and issues.



Cooper & Dilley              Informational                     [Page 18]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


References

   [1]  Paxson, V., Allman, M., Dawson, S., Fenner, W., Griner, J.,
        Heavens, I., Lahey, K., Semke, J. and B. Volz, "Known TCP
        Implementation Problems", RFC 2525, March 1999.

   [2]  Cooper, I., Melve, I. and G. Tomlinson, "Internet Web
        Replication and Caching Taxonomy", RFC 3040, January 2001.

   [3]  Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
        Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
        HTTP/1.1", RFC 2616, June 1999.

   [4]  Wessels, D. and K. Claffy, "Internet Cache Protocol (ICP),
        Version 2", RFC 2186, September 1997.

   [5]  Davison, B., "Web Traffic Logs: An Imperfect Resource for
        Evaluation", in Proceedings of the Ninth Annual Conference of
        the Internet Society (INET'99), July 1999.

   [6]  Melve, I., "Relation Analysis, Cache Meshes", in Proceedings of
        the 3rd International WWW Caching Workshop, June 1998,
        <http://wwwcache.ja.net/events/workshop/29/magicnumber.html>.

   [7]  Krishnamurthy, B. and M. Arlett, "PRO-COW: Protocol Compliance
        on the Web", AT&T Labs Technical Report #990803-05-TM, August
        1999, <http://www.research.att.com/~bala/papers/procow-1.ps.gz>.

   [8]  Netscape, Inc., "Navigator Proxy Auto-Config File Format", March
        1996,
        http://home.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-
        live.html

   [9]  Mogul, J., Krishnamurthy, B., Douglis, F., Feldmann, A., Goland,
        Y., van Hoff, A. and D. Hellerstein, "HTTP Delta in HTTP", Work
        in Progress.















Cooper & Dilley              Informational                     [Page 19]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


Authors' Addresses

   Ian Cooper
   Equinix, Inc.
   2450 Bayshore Parkway
   Mountain View, CA  94043
   USA

   Phone: +1 650 316 6065
   EMail: icooper@equinix.com


   John Dilley
   Akamai Technologies, Inc.
   1400 Fashion Island Blvd
   Suite 703
   San Mateo, CA  94404
   USA

   Phone: +1 650 627 5244
   EMail: jad@akamai.com






























Cooper & Dilley              Informational                     [Page 20]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


Appendix A.  Archived Known Problems

   The following sub-sections are an archive of problems identified in
   the initial production of this memo.  These are typically problems
   requiring further work/research, or user education.  They are
   included here for reference purposes only.

A.1 Architectural

A.1.1 Cannot specify multiple URIs for replicated resources

   Name
      Cannot specify multiple URIs for replicated resources

   Classification
      Architecture

   Description
      There is no way to specify that multiple URIs may be used for a
      single resource, one for each replica of the resource.  Similarly,
      there is no way to say that some set of proxies (each identified
      by a URI) may be used to resolve a URI.

   Significance
      Medium

   Implications
      Forces users to understand the replication model and mechanism.
      Makes it difficult to create a replication framework without
      protocol support for replication and naming.

   Indications
      Inherent in HTTP/1.0, HTTP/1.1.

   Solution(s)
      Architectural - protocol design is necessary.

   Workaround
      Replication mechanisms force users to locate a replica or mirror
      site for replicated content.

   Contact
      Daniel LaLiberte <liberte@w3.org>








Cooper & Dilley              Informational                     [Page 21]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


A.1.2 Replica distance is unknown

   Name
      Replica distance is unknown

   Classification
      Architecture

   Description
      There is no recommended way to find out which of several servers
      or proxies is closer either to the requesting client or to another
      machine, either geographically or in the network topology.

   Significance
      Medium

   Implications
      Clients must guess which replica is closer to them when requesting
      a copy of a document that may be served from multiple locations.
      Users must know the set of servers that can serve a particular
      object.  This in general is hard to determine and maintain.  Users
      must understand network topology in order to choose the closest
      copy.  Note that the closest copy is not always the one that will
      result in quickest service.  A nearby but heavily loaded server
      may be slower than a more distant but lightly loaded server.

   Indications
      Inherent in HTTP/1.0, HTTP/1.1.

   Solution(s)
      Architectural - protocol work is necessary.  This is a specific
      instance of a general problem in widely distributed systems.  A
      general solution is unlikely, however a specific solution in the
      web context is possible.

   Workaround
      Servers can (many do) provide location hints in a replica
      selection web page.  Users choose one based upon their location.
      Users can learn which replica server gives them best performance.
      Note that the closest replica geographically is not necessarily
      the closest in terms of network topology.  Expecting users to
      understand network topology is unreasonable.

   Contact
      Daniel LaLiberte <liberte@w3.org>






Cooper & Dilley              Informational                     [Page 22]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


A.1.3 Proxy resource location

   Name
      Proxy resource location

   Classification
      Architecture

   Description
      There is no way for a client or server (including another proxy)
      to inform a proxy of an alternate address (perhaps including the
      proxy to use to reach that address) to use to fetch a resource.
      If the client does not trust where the redirected resource came
      from, it may need to validate it or validate where it came from.

   Significance
      Medium

   Implications
      Proxies have no systematic way to locate resources within other
      proxies or origin servers.  This makes it more difficult to share
      information among proxies.  Information sharing would improve
      global efficiency.

   Indications
      Inherent in HTTP/1.0, HTTP/1.1.

   Solution(s)
      Architectural - protocol design is necessary.

   Workaround
      Certain proxies share location hints in the form of summary
      digests of their contents (e.g., Squid).  Certain proxy protocols
      enable a proxy query another for its contents (e.g., ICP).  (See
      however "ICP  Performance" issue (Section 2.2.5).)

   Contact
      Daniel LaLiberte <liberte@w3.org>

A.2 Implementation

A.2.1 Use of Cache-Control headers

   Name
      Use of Cache-Control headers

   Classification
      Implementation



Cooper & Dilley              Informational                     [Page 23]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Description
      Many (if not most) implementations incorrectly interpret Cache-
      Control response headers.

   Significance
      High

   Implications
      Cache-Control headers will be spurned by end users if there are
      conflicting or non-standard implementations.

   Indications
      -

   Solution(s)
      Work with vendors and others to assure proper application

   Workaround
      None.

   Contact
      Mark Nottingham <mnot@mnot.net>

A.2.2 Lack of HTTP/1.1 compliance for caching proxies

   Name
      Lack of HTTP/1.1 compliance for caching proxies

   Classification
      Implementation

   Description
      Although performance benchmarking of caches is starting to be
      explored, protocol compliance is just as important.

   Significance
      High

   Implications
      Caching proxy vendors implement their interpretation of the
      specification; because the specification is very large, sometimes
      vague and ambiguous, this can lead to inconsistent behavior
      between caching proxies.

      Caching proxies need to comply to the specification (or the
      specification needs to change).





Cooper & Dilley              Informational                     [Page 24]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Indications
      There is no currently known compliance test being used.

      There is work underway to quantify how closely servers comply with
      the current specification.  A joint technical report between AT&T
      and HP Labs [7] describes the compliance testing.  This report
      examines how well each of a set of top traffic-producing sites
      support certain HTTP/1.1 features.

      The Measurement Factory (formerly IRCache) is working to develop
      protocol compliance testing software.  Running such a conformance
      test suite against caching proxy products would measure compliance
      and ultimately would help assure they comply to the specification.

   Solution(s)
      Testing should commence and be reported in an open industry forum.
      Proxy implementations should conform to the specification.

   Workaround
      There is no workaround for non-compliance.

   Contact
      Mark Nottingham <mnot@mnot.net>
      Duane Wessels <wessels@measurement-factory.com>

A.2.3 ETag support

   Name
      ETag support

   Classification
      Implementation

   Description
      Available caching proxies appear not to support ETag (strong)
      validation.

   Significance
      Medium

   Implications
      Last-Modified/If-Modified-Since validation is inappropriate for
      many requirements, both because of its weakness and its use of
      dates.  Lack of a usable, strong coherency protocol leads
      developers and end users not to trust caches.

   Indications
      -



Cooper & Dilley              Informational                     [Page 25]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Solution(s)
      Work with vendors to implement ETags; work for better validation
      protocols.

   Workaround
      Use Last-Modified/If-Modified-Since validation.

   Contact
      Mark Nottingham <mnot@mnot.net>

A.2.4 Servers and content should be optimized for caching

   Name
      Servers and content should be optimized for caching

   Classification
      Implementation (Performance)

   Description
      Many web servers and much web content could be implemented to be
      more conducive to caching, reducing bandwidth demand and page load
      delay.

   Significance
      Medium

   Implications
      By making poor use of caches, origin servers encourage longer load
      times, greater load on caching proxies, and increased network
      demand.

   Indications
      The problem is most apparent for pages that have low or zero
      expires time, yet do not change.

   Solution(s)
      -

   Workaround
      Servers could start using unique object identifiers for write-only
      content: if an object changes it gets a new name, otherwise it is
      considered to be immutable and therefore have an infinite expire
      age.  Certain hosting providers do this already.

   Contact
      Peter Danzig





Cooper & Dilley              Informational                     [Page 26]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


A.3 Administration

A.3.1 Lack of fine-grained, standardized hierarchy controls

   Name
      Lack of fine-grained, standardized hierarchy controls

   Classification
      Administration

   Description
      There is no standard for instructing a proxy as to how it should
      resolve the parent to fetch a given object from.  Implementations
      therefore vary greatly, and it can be difficult to make them
      interoperate correctly in a complex environment.

   Significance
      Medium

   Implications
      Complications in deployment of caches in a complex network
      (especially corporate networks)

   Indications
      Inability of some proxies to be configured to direct traffic based
      on domain name, reverse lookup IP address, raw IP address, in
      normal operation and in failover mode.  Inability in some proxies
      to set a preferred parent / backup parent configuration.

   Solution(s)
      -

   Workaround
      Work with vendors to establish an acceptable configuration within
      the limits of their product; standardize on one product.

   Contact
      Mark Nottingham <mnot@mnot.net>

A.3.2 Proxy/Server exhaustive log format standard for analysis

   Name
      Proxy/Server exhaustive log format standard for analysis

   Classification
      Administration





Cooper & Dilley              Informational                     [Page 27]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Description
      Most proxy or origin server logs used for characterization or
      evaluation do not provide sufficient detail to determine
      cacheability of responses.

   Significance
      Low (for operationality; high significance for research efforts)

   Implications
      Characterizations and simulations are based on non-representative
      workloads.

   See Also
      W3C Web Characterization Activity, since they are also concerned
      with collecting high quality logs and building characterizations
      from them.

   Indications
      -

   Solution(s)
      To properly clean and to accurately determine cacheability of
      responses, a complete log is required (including all request
      headers as well as all response headers such as "User-agent" [for
      removal of spiders] and "Expires", "max-age", "Set-cookie", "no-
      cache", etc.)

   Workaround
      -

   References
      See "Web Traffic Logs: An Imperfect Resource for Evaluation"[5]
      for some discussion of this.

   Contact
      Brian D. Davison <davison@acm.org>
      Terence Kelly <tpkelly@eecs.umich.edu>

A.3.3 Trace log timestamps

   Name
      Trace log timestamps

   Classification
      Administration






Cooper & Dilley              Informational                     [Page 28]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Description
      Some proxies/servers log requests without sufficient timing
      detail.  Millisecond resolution is often too small to preserve
      request ordering and either the servers should record request
      reception time in addition to completion time, or elapsed time
      plus either one.

   Significance
      Low (for operationality; medium significance for research efforts)

   Implications
      Characterization and simulation fidelity is improved with accurate
      timing and ordering information.  Since logs are generally written
      in order of request completion, these logs cannot be re-played
      without knowing request generation times and reordering
      accordingly.

   See Also
      -

   Indications
      Timestamps can be identical for multiple entries (when only
      millisecond resolution is used).  Request orderings can be jumbled
      when clients open additional connections for embedded objects
      while still receiving the container object.

   Solution(s)
      Since request completion time is common (e.g., Squid), recommend
      continuing to use it (with microsecond resolution if possible)
      plus recording elapsed time since request reception.

   Workaround
      -

   References
      See "Web Traffic Logs: An Imperfect Resource for Evaluation"[5]
      for some discussion of this.

   Contact
      Brian D. Davison <davison@acm.org>

A.3.4 Exchange format for log summaries

   Name
      Exchange format for log summaries

   Classification
      Administration/Analysis?



Cooper & Dilley              Informational                     [Page 29]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Description
      Although we have (more or less) a standard log file format for
      proxies (plain vanilla Common Logfile and Squid), there isn't a
      commonly accepted format for summaries of those log files.
      Summaries could be generated by the cache itself, or by post-
      processing existing log file formats such as Squid's.

   Significance
      High, since it means that each log file summarizing/analysis tool
      is essentially reinventing the wheel (un-necessary repetition of
      code), and the cost of processing a large number of large log
      files through a variety of analysis tools is (again for no good
      reason) excessive.

   Implications
      In order to perform a meaningful analysis (e.g., to measure
      performance in relation to loading/configuration over time) the
      access logs from multiple busy caches, it's often necessary to run
      first one tool then another, each against the entire log file (or
      a significantly large subset of the log).  With log files running
      into hundreds of MB even after compression (for a cache dealing
      with millions of transactions per day) this is a non-trivial task.

   See Also
      IP packet/header sniffing - it may be that individual transactions
      are at a level of granularity which simply isn't sensible to be
      attempting on extremely busy caches.  There may also be legal
      implications in some countries, e.g., if this analysis identifies
      individuals.

   Indications
      Disks/memory full(!) Stats (using multiple programs) take too long
      to run.  Stats crunching must be distributed out to multiple
      machines because of its high computational cost.

   Solution(s)
      Have the proxy produce a standardized summary of its activity
      either automatically or via an external (e.g., third party) tool,
      in a commonly agreed format.  The format could be something like
      XML or the Extended Common Logfile, but the format and contents
      are subjects for discussion.  Ideally this approach would permit
      individual cache server products to supply subsets of the possible
      summary info, since it may not be feasible for all servers to
      provide all of the information which people would like to see.







Cooper & Dilley              Informational                     [Page 30]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


   Workaround
      Devise a private summary format for your own personal use - but
      this complicates or even precludes the exchange of summary info
      with other interested parties.

   References
      See the web pages for the commonly used cache stats analysis
      programs, e.g., Calamaris, squidtimes, squidclients, etc.

   Contact
      Martin Hamilton <martin@wwwcache.ja.net>








































Cooper & Dilley              Informational                     [Page 31]

RFC 3143           Known HTTP Proxy/Caching Problems           June 2001


Full Copyright Statement

   Copyright (C) The Internet Society (2001).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Cooper & Dilley              Informational                     [Page 32]


Added doc/rfc3205.txt.




















































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                           K. Moore
Request for Comments: 3205                       University of Tennessee
BCP: 56                                                    February 2002
Category: Best Current Practice


                   On the use of HTTP as a Substrate

Status of this Memo

   This document specifies an Internet Best Current Practices for the
   Internet Community, and requests discussion and suggestions for
   improvements.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

Abstract

   Recently there has been widespread interest in using Hypertext
   Transfer Protocol (HTTP) as a substrate for other applications-level
   protocols.  This document recommends technical particulars of such
   use, including use of default ports, URL schemes, and HTTP security
   mechanisms.

1. Introduction

   Recently there has been widespread interest in using Hypertext
   Transfer Protocol (HTTP) [1] as a substrate for other applications-
   level protocols.  Various reasons cited for this interest have
   included:

   o  familiarity and mindshare,

   o  compatibility with widely deployed browsers,

   o  ability to reuse existing servers and client libraries,

   o  ease of prototyping servers using CGI scripts and similar
      extension mechanisms,

   o  ability to use existing security mechanisms such as HTTP digest
      authentication [2] and SSL or TLS [3],

   o  the ability of HTTP to traverse firewalls, and

   o  cases where a server often needs to support HTTP anyway.



Moore                    Best Current Practice                  [Page 1]

RFC 3205                     HTTP Layering                 February 2002


   The Internet community has a long tradition of protocol reuse, dating
   back to the use of Telnet [4] as a substrate for FTP [5] and SMTP
   [6].  However, the recent interest in layering new protocols over
   HTTP has raised a number of questions when such use is appropriate,
   and the proper way to use HTTP in contexts where it is appropriate.
   Specifically, for a given application that is layered on top of HTTP:

   o  Should the application use a different port than the HTTP default
      of 80?

   o  Should the application use traditional HTTP methods (GET, POST,
      etc.) or should it define new methods?

   o  Should the application use http: URLs or define its own prefix?

   o  Should the application define its own MIME-types, or use something
      that already exists (like registering a new type of MIME-directory
      structure)?

   This memo recommends certain design decisions in answer to these
   questions.

   This memo is intended as advice and recommendation for protocol
   designers, working groups, implementors, and IESG, rather than as a
   strict set of rules which must be adhered to in all cases.
   Accordingly, the capitalized key words defined in RFC 2119, which are
   intended to indicate conformance to a specification, are not used in
   this memo.

2. Issues Regarding the Design Choice to use HTTP

   Despite the advantages listed above, it's worth asking the question
   as to whether HTTP should be used at all, or whether the entire HTTP
   protocol should be used.

2.1 Complexity

   HTTP started out as a simple protocol, but quickly became much more
   complex due to the addition of several features unanticipated by its
   original design.  These features include persistent connections, byte
   ranges, content negotiation, and cache support.  All of these are
   useful for traditional web applications but may not be useful for the
   layered application.  The need to support (or circumvent) these
   features can add additional complexity to the design and
   implementation of a protocol layered on top of HTTP.  Even when HTTP
   can be "profiled" to minimize implementation overhead, the effort of
   specifying such a profile might be more than the effort of specifying
   a purpose-built protocol which is better suited to the task at hand.



Moore                    Best Current Practice                  [Page 2]

RFC 3205                     HTTP Layering                 February 2002


   Even if existing HTTP client and server code can often be re-used,
   the additional complexity of layering something over HTTP vs. using a
   purpose-built protocol can increase the number of interoperability
   problems.

2.2 Overhead

   Further, although HTTP can be used as the transport for a "remote
   procedure call" paradigm, HTTP's protocol overhead, along with the
   connection setup overhead of TCP, can make HTTP a poor choice.  A
   protocol based on UDP, or with both UDP and TCP variants, should be
   considered if the payloads are very likely to be small (less than a
   few hundred bytes) for the foreseeable future.  This is especially
   true if the protocol might be heavily used, or if it might be used
   over slow or expensive links.

   On the other hand, the connection setup overhead can become
   negligible if the layered protocol can utilize HTTP/1.1's persistent
   connections, and if the same client and server are likely to perform
   several transactions during the time the HTTP connection is open.

2.3 Security

   Although HTTP appears at first glance to be one of the few "mature"
   Internet protocols that can provide good security, there are many
   applications for which neither HTTP's digest authentication nor TLS
   are sufficient by themselves.

   Digest authentication requires a secret (e.g., a password) to be
   shared between client and server.  This further requires that each
   client know the secret to be used with each server, but it does not
   provide any means of securely transmitting such secrets between the
   parties.  Shared secrets can work fine for small groups where
   everyone is physically co-located; they don't work as well for large
   or dispersed communities of users.  Further, if the server is
   compromised a large number of secrets may be exposed, which is
   especially dangerous if the same secret (or password) is used for
   several applications.  (Similar concerns exist with TLS based clients
   or servers - if a private key is compromised then the attacker can
   impersonate the party whose key it has.)

   TLS and its predecessor SSL were originally designed to authenticate
   web servers to clients, so that a user could be assured (for example)
   that his credit card number was not being sent to an imposter.
   However, many applications need to authenticate clients to servers,
   or to provide mutual authentication of client and server.  TLS does





Moore                    Best Current Practice                  [Page 3]

RFC 3205                     HTTP Layering                 February 2002


   have a capability to provide authentication in each direction, but
   such authentication may or may not be suitable for a particular
   application.

   Web browsers which support TLS or SSL are typically shipped with the
   public keys of several certificate authorities (CAs) "wired in" so
   that they can verify the identity of any server whose public key was
   signed by one of those CAs.  For this to work well, every secure web
   server's public key has to be signed by one of the CAs whose keys are
   wired into popular browsers.  This deployment model works when there
   are a (relatively) small number of servers whose identities can be
   verified, and their public keys signed, by the small number of CAs
   whose keys are included in a small number of different browsers.

   This scheme does not work as well to authenticate millions of
   potential clients to servers.  It would take a much larger number of
   CAs to do the job, each of which would need to be widely trusted by
   servers.  Those CAs would also have a more difficult time verifying
   the identities of (large numbers of) ordinary users than they do in
   verifying the identities of (a smaller number of) commercial and
   other enterprises that need to run secure web servers.

   Also, in a situation where there were a large number of clients
   authenticating with TLS, it seems unlikely that there would be a set
   of CAs whose keys were trusted by every server.  A client that
   potentially needed to authenticate to multiple servers would
   therefore need to be configured as to which key to use with which
   server when attempting to establish a secure connection to the
   server.

   For the reasons stated above, client authentication is rarely used
   with TLS.  A common technique is to use TLS to authenticate the
   server to the client and to establish a private channel, and for the
   client to authenticate to the server using some other means - for
   example, a username and password using HTTP basic or digest
   authentication.

   For any application that requires privacy, the 40-bit ciphersuites
   provided by some SSL implementations (to conform to outdated US
   export regulations or to regulations on the use or export of
   cryptography in other countries) are unsuitable.  Even 56-bit DES
   encryption, which is required of conforming TLS implementations, has
   been broken in a matter of days with a modest investment in
   resources.  So if TLS is chosen it may be necessary to discourage use
   of small key lengths, or of weak ciphersuites, in order to provide
   adequate privacy assurance.  If TLS is used to provide privacy for
   passwords sent by clients then it is especially important to support
   longer keys.



Moore                    Best Current Practice                  [Page 4]

RFC 3205                     HTTP Layering                 February 2002


   None of the above should be taken to mean that either digest
   authentication or TLS are generally inferior to other authentication
   systems, or that they are unsuitable for use in other applications
   besides HTTP.  Many of the limitations of TLS and digest
   authentication also apply to other authentication and privacy
   systems.  The point here is that neither TLS nor digest
   authentication is a "magic pixie dust" solution to authentication or
   privacy.  In every case, an application's designers must carefully
   determine the application's users' requirements for authentication
   and privacy before choosing an authentication or privacy mechanism.

   Note also that TLS can be used with other TCP-based protocols, and
   there are SASL [7] mechanisms similar to HTTP's digest
   authentication.  So it is not necessary to use HTTP in order to
   benefit from either TLS or digest-like authentication.  However, HTTP
   APIs may already support TLS and/or digest.

2.4 Compatibility with Proxies, Firewalls, and NATs

   One oft-cited reason for the use of HTTP is its ability to pass
   through proxies, firewalls, or network address translators (NATs).
   One unfortunate consequence of firewalls and NATs is that they make
   it harder to deploy new Internet applications, by requiring explicit
   permission (or even a software upgrade of the firewall or NAT) to
   accommodate each new protocol.  The existence of firewalls and NATs
   creates a strong incentive for protocol designers to layer new
   applications on top of existing protocols, including HTTP.

   However, if a site's firewall prevents the use of unknown protocols,
   this is presumably a conscious policy decision on the part of the
   firewall administrator.  While it is arguable that such policies are
   of limited value in enhancing security, this is beside the point -
   well-known port numbers are quite useful for a variety of purposes,
   and the overloading of port numbers erodes this utility.  Attempting
   to circumvent a site's security policy is not an acceptable
   justification for doing so.

   It would be useful to establish guidelines for "firewall-friendly"
   protocols, to make it easier for existing firewalls to be compatible
   with new protocols.

2.5 Questions to be asked when considering use of HTTP

   o  When considering payload size and traffic patterns, is HTTP an
      appropriate transport for the anticipated use of this protocol?






Moore                    Best Current Practice                  [Page 5]

RFC 3205                     HTTP Layering                 February 2002


      (In other words: will the payload size be worth the overhead
      associated with TCP and HTTP?  Or will the application be able to
      make use of HTTP persistent connections to amortize the cost of
      that overhead over several requests?)

   o  Is this new protocol usable by existing web browsers without
      modification?

      (For example: Is the request transmitted as if it were a filled-in
      HTML form?  Is the response which is returned viewable from a web
      browser, say as HTML?)

   o  Are the existing HTTP security mechanisms appropriate for the new
      application?

   o  Are HTTP status codes and the HTTP status code paradigm suitable
      for this application?  (see section 8)

   o  Does the server for this application need to support HTTP anyway?

3. Issues Regarding Reuse of Port 80

   IANA has reserved TCP port number 80 for use by HTTP.  It would not
   be appropriate for a substantially new service, even one which uses
   HTTP as a substrate, to usurp port 80 from its traditional use.  A
   new use of HTTP might be considered a "substantially new service",
   thus requiring a new port, if any of the following are true:

   o  The "new service" and traditional HTTP service are likely to
      reference different sets of data, even when they both operate on
      the same host.

   o  There is a good reason for the "new service" to be implemented by
      a separate server process, or separate code, than traditional HTTP
      service on the same host, at least on some platforms.

   o  There is a good reason to want to easily distinguish the traffic
      of the "new service" from traditional HTTP, e.g., for the purposes
      of firewall access control or traffic analysis.

   o  If none of the above are true, it is arguable that the new use of
      HTTP is an "extension" to traditional HTTP, rather than a "new
      service".  Extensions to HTTP which share data with traditional
      HTTP services should probably define new HTTP methods to describe
      those extensions, rather than using separate ports.  If separate
      ports are used, there is no way for a client to know whether they
      are separate services or different ways of accessing the same
      underlying service.



Moore                    Best Current Practice                  [Page 6]

RFC 3205                     HTTP Layering                 February 2002


4. Issues Regarding Reuse of the http: Scheme in URLs

   A number of different URL schemes are in widespread use and many more
   are in the process of being standardized.  In practice, the URL
   scheme not only serves as a "tag" to govern the interpretation of the
   remaining portion of the URL, it also provides coarse identification
   of the kind of resource or service which is being accessed.  For
   example, web browsers typically provide a different response when a
   user mouse-clicks on an "http" URL, than when the user clicks on a
   "mailto" URL.

   Some criteria that might be used in making this determination are:

   o  Whether this URL scheme is likely to become widely used, versus
      used only in limited communities or by private agreement.

   o  Whether a new "default port" is needed.  If reuse of port 80 is
      not appropriate (see above), a new "default port" is needed.  A
      new default port in turn requires that a new URL scheme be
      registered if that URL scheme is expected to be widely used.
      Explicit port numbers in URLs are regarded as an "escape hatch",
      not something for use in ordinary circumstances.

   o  Whether use of the new service is likely to require a
      substantially different setup or protocol interaction with the
      server, than ordinary HTTP service.  This could include the need
      to request a different type of service from the network, or to
      reserve bandwidth, or to present different TLS authentication
      credentials to the server, or different kind of server
      provisioning, or any number of other needs.

   o  Whether user interfaces (such as web browsers) are likely to be
      able to exploit the difference in the URL prefix to produce a
      significant improvement in usability.

   According to the rules in [8] the "http:" URI is part of the "IETF
   Tree" for URL scheme names, and IETF is the maintainer of the "IETF
   Tree".  Since IESG is the decision-making body for IETF, IESG has the
   authority to determine whether a resource accessed by a protocol that
   is layered on top of HTTP, should use http: or some other URL prefix.

   Note that the convention of appending an "s" to the URL scheme to
   mean "use TLS or SSL" (as in "http:" vs "https:") is nonstandard and
   of limited value.  For most applications, a single "use TLS or SSL"
   bit is not sufficient to adequately convey the information that a
   client needs to authenticate itself to a server, even if it has the
   proper credentials.  For instance, in order to ensure that adequate
   security is provided with TLS an application may need to be



Moore                    Best Current Practice                  [Page 7]

RFC 3205                     HTTP Layering                 February 2002


   configured with a list of acceptable ciphersuites, or with the client
   certificate to be used to authenticate to a particular server.  When
   it is necessary to specify authentication or other connection setup
   information in a URL these should be communicated in URL parameters,
   rather than in the URL prefix.

5. Issues regarding use of MIME media types

   Since HTTP uses the MIME media type system [9] to label its payload,
   many applications which layer on HTTP will need to define, or select,
   MIME media types for use by that application.  Especially when using
   a multipart structure, the choice of media types requires careful
   consideration.  In particular:

   o  Should some existing framework be used, such as text/directory
      [10], or XML [11,12], or should the new content-types be built
      from scratch?  Just as with HTTP, it's useful if code can be
      reused, but protocol designers should not be over-eager to
      incorporate a general but complex framework into a new protocol.
      Experience with ASN.1, for example, suggests that the advantage of
      using a general framework may not be worth the cost.

   o  Should MIME multipart or message types be allowed?  This can be an
      advantage if it is desirable to incorporate (for example) the
      multipart/alternative construct or the MIME security framework.
      On the other hand, these constructs were designed specifically for
      use in store-and-forward electronic mail systems, and other
      mechanisms may be more appropriate for the application being
      considered.

      The point here is that a decision to use MIME content-type names
      to describe protocol payloads (which is generally desirable if the
      same payloads may appear in other applications) does not imply
      that the application must accept arbitrary MIME content-types,
      including MIME multipart or security mechanisms.  Nor does it
      imply that the application must use MIME syntax or that it must
      recognize or even tolerate existing MIME header fields.

   o  If the same payload is likely to be sent over electronic mail, the
      differences between HTTP encoding of the payload and email
      encoding of the payload should be minimized.  Ideally, there
      should be no differences in the "canonical form" used in the two
      environments.  Text/* media types can be problematic in this
      regard because MIME email requires CRLF for line endings of text/*
      body parts, where HTTP traditionally uses LF only.






Moore                    Best Current Practice                  [Page 8]

RFC 3205                     HTTP Layering                 February 2002


   o  A MIME content-type label describes the nature of the object being
      labeled.  It does not describe, and should not be used to
      describe, the semantics which should be applied when the object is
      received.  For instance, the transmission of an object with a
      particular content-type using HTTP POST, should not be taken as a
      request for some operation based solely on the type.  The request
      should be separate from the content-type label and it should be
      explicit.

      When it is necessary for a protocol layered on HTTP to allow
      different operations on the same type of object, this can be
      communicated in a number of different ways: HTTP methods, HTTP
      request-URI, HTTP request headers, the MIME Content-Disposition
      header field, or as part of the payload.

6. Issues Regarding Existing vs.  New HTTP Methods

   It has been suggested that a new service layered on top of HTTP
   should define one or more new HTTP methods, rather than allocating a
   new port.  The use of new methods may be appropriate, but is not
   sufficient in all cases.  The definition of one or more new methods
   for use in a new protocol, does not by itself alleviate the need for
   use of a new port, or a new URL type.

7. Issues regarding reuse of HTTP client, server, and proxy code

   As mentioned earlier, one of the primary reasons for the use of HTTP
   as a substrate for new protocols, is to allow reuse of existing HTTP
   client, server, or proxy code.  However, HTTP was not designed for
   such layering.  Existing HTTP client and code may have "http"
   assumptions wired into them.  For instance, client libraries and
   proxies may expect "http:" URLs, and clients and servers may send
   (and expect) "HTTP/1.1", in requests and responses, as opposed to the
   name of the layered protocol and its version number.

   Existing client libraries may not understand new URL types.  In order
   to get a new HTTP-layered application client to work with an existing
   client library, it may be necessary for the application to convert
   its URLs to an "http equivalent" form.  For instance, if service
   "xyz" is layered on top of HTTP using port ###, the xyz client may
   need, when invoking an HTTP client library, to translate its URLs
   from "xyz://host/something" format to "http://host:###/something" for
   the purpose of calling that library.  This should be done ONLY when
   calling the HTTP client library - such URLs should not be used in
   other parts of the protocol, nor should they be exposed to users.






Moore                    Best Current Practice                  [Page 9]

RFC 3205                     HTTP Layering                 February 2002


   Note that when a client is sending requests directly to an origin
   server, the URL prefix ("http:") is not normally sent.  So
   translating xyz: URLs to http: URLs when calling the client library
   should not actually cause http: URLs to be sent over the wire.  But
   when the same client is sending requests to a proxy server, the
   client will normally send the entire URL (including the http: prefix)
   in those requests.  The proxy will remove the http: prefix when the
   request is communicated to the origin server.

   Existing HTTP client libraries and servers will transmit "HTTP/1.1"
   (or a different version) in requests and responses.  To facilitate
   reuse of such libraries and servers by a new protocol, such a
   protocol may therefore need to transmit and accept "HTTP/1.1" rather
   than its own protocol name and version number.  Designers of
   protocols which are layered on top of HTTP should explicitly choose
   whether or not to accept "HTTP/1.1" in protocol exchanges.

   For certain applications it may be necessary to require or limit use
   of certain HTTP features, for example, to defeat caching of responses
   by proxies.  Each protocol layered on HTTP must therefore specify the
   specific way that HTTP will be used, and in particular, how the
   client and server should interact with HTTP proxies.

8.  Issues regarding use of HTTP status codes

   HTTP's three-digit status codes were designed for use with
   traditional HTTP applications (e.g., document retrieval, forms-based
   queries), and are unlikely to be suitable to communicate the
   specifics of errors encountered in dissimilar applications.  Even
   when it seems like there is a close match between HTTP status codes
   and the codes needed by the application, experience with reuse of
   other protocols indicates that subtle variations in usage are likely;
   and that this is likely to degrade interoperability of both the
   original protocol (in this case HTTP) and any layered applications.

   HTTP status codes therefore should not be used to indicate subtle
   errors of layered applications.  At most, the "generic" HTTP codes
   200 (for complete success) and 500 (for complete failure) should be
   used to indicate errors resulting from the content of the request
   message-body.  Under certain circumstances, additional detail about
   the nature of the error can then be included in the response
   message-body.  Other status codes than 200 or 500 should only appear
   if the error was detected by the HTTP server or by an intermediary.

   A layered application should not define new HTTP status codes.  The
   set of available status codes is small, conflicts in code assignment
   between different layered applications are likely, and they may be
   needed by future versions of, or extensions to, mainstream HTTP.



Moore                    Best Current Practice                 [Page 10]

RFC 3205                     HTTP Layering                 February 2002


   Use of HTTP's error codes is problematic when the layered application
   does not share same notion of success or failure as HTTP.  The
   problem exists when the client does not connect directly to the
   origin server, but via one or more HTTP caches or proxies.  (Since
   the ability of HTTP to communicate through intermediaries is often
   the primary motivation for reusing HTTP, the ability of the
   application to operate in the presence of such intermediaries is
   considered very important.)  Such caches and proxies will interpret
   HTTP's error codes and may take additional action based on those
   codes.  For instance, on receipt of a 200 error code from an origin
   server (and under other appropriate conditions) a proxy may cache the
   response and re-issue it in response to a similar request.  Or a
   proxy may modify the result of a request which returns a 500 error
   code in order to add a "helpful" error message.  Other response codes
   may produce other behaviors.

   A few guidelines are therefore in order:

   o  A layered application should use appropriate HTTP error codes to
      report errors resulting from information in the HTTP request-line
      and header fields associated with the request.  This request
      information is part of the HTTP protocol and errors which are
      associated with that information should therefore be reported
      using HTTP protocol mechanisms.

   o  A layered application for which all errors resulting from the
      message-body can be classified as either "complete success" or
      "complete failure" may use 200 and 500 for those conditions,
      respectively.  However, the specification for such an application
      must define the mechanism which ensures that its successful (200)
      responses are not cached by intermediaries, or demonstrate that
      such caching will do no harm; and it must be able to operate even
      if the message-body of an error (500) response is not transmitted
      back to the client intact.

   o  A layered application may return a 200 response code for both
      successfully processed requests and errors (or other exceptional
      conditions) resulting from the request message-body (but not from
      the request headers).  Such an application must return its error
      code as part of the response message body, and the specification
      for that application protocol must define the mechanism by which
      the application ensures that its responses are not cached by
      intermediaries.  In this case a response other than 200 should be
      used only to indicate errors with, or the status of, the HTTP
      protocol layer (including the request headers), or to indicate the
      inability of the HTTP server to communicate with the application
      server.




Moore                    Best Current Practice                 [Page 11]

RFC 3205                     HTTP Layering                 February 2002


   o  A layered application which cannot operate in the presence of
      intermediaries or proxies that cache and/or alter error responses,
      should not use HTTP as a substrate.

9. Summary of recommendations regarding reuse of HTTP

   1. All protocols should provide adequate security.  The security
      needs of a particular application will vary widely depending on
      the application and its anticipated use environment.  Merely using
      HTTP and/or TLS as a substrate for a protocol does not
      automatically provide adequate security for all environments, nor
      does it relieve the protocol developers of the need to analyze
      security considerations for their particular application.

   2. New protocols - including but not limited to those using HTTP -
      should not attempt to circumvent users' firewall policies,
      particularly by masquerading as existing protocols.
      "Substantially new services" should not reuse existing ports.

   3. In general, new protocols or services should not reuse http: or
      other URL schemes.

   4. Each new protocol specification that uses HTTP as a substrate
      should describe the specific way that HTTP is to be used by that
      protocol, including how the client and server interact with
      proxies.

   5. New services should follow the guidelines in section 8 regarding
      use of HTTP status codes.

10.  Security Considerations

   Much of this document is about security.  Section 2.3 discusses
   whether HTTP security is adequate for the needs of a particular
   application, section 2.4 discusses interactions between new HTTP-
   based protocols and firewalls, section 3 discusses use of separate
   ports so that firewalls are not circumvented, and section 4 discusses
   the inadequacy of the "s" suffix of a URL prefix for specifying
   security levels.

11.  References

   [1]   Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
         Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
         HTTP/1.1", RFC 2616, June 1999.






Moore                    Best Current Practice                 [Page 12]

RFC 3205                     HTTP Layering                 February 2002


   [2]   Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
         Leach, P., Luotonen, A. and L. Stewart, "HTTP Authentication:
         Basic and Digest Access Authentication", RFC 2617, June 1999.

   [3]   Dierks, T. and C. Allen, "The TLS Protocol Version 1.0", RFC
         2246, January 1999.

   [4]   Postel, J. and J. Reynolds, "Telnet Protocol Specification",
         STD 8, RFC 854, May 1983.

   [5]   Postel, J. and J. Reynolds, "File Transfer Protocol", STD 9,
         RFC 959, October 1985.

   [6]   Klensin, J., "Simple Mail Transfer Protocol", RFC 2821, April
         2001.

   [7]   Myers, J., "Simple Authentication and Security Layer (SASL)",
         RFC 2222, October 1997.

   [8]   Petke, R. and I. King, "Registration Procedures for URL Scheme
         Names", BCP 35, RFC 2717, November 1999.

   [9]   Freed, N. and N. Borenstein, "Multipurpose Internet Mail
         Extensions (MIME) Part Two: Media Types", RFC 2046, November
         1996.

   [10]  Howes, T., Smith, M. and F. Dawson, "A MIME Content-Type for
         Directory Information", RFC 2425, September 1998.

   [11]  Bray, T., Paoli, J. and C. Sperberg-McQueen, "Extensible Markup
         Language (XML)" World Wide Web Consortium Recommendation REC-
         xml-19980210, February 1998.  http://www.w3.org/TR/1998/REC-
         xml-19980210.

   [12]  Murata, M., St. Laurent, S. and D. Kohn, "XML Media Types", RFC
         3023, January 2001.

12.  Author's Address

   Keith Moore
   University of Tennessee
   Computer Science Department
   1122 Volunteer Blvd, Suite 203
   Knoxville TN, 37996-3450
   USA

   EMail: moore@cs.utk.edu




Moore                    Best Current Practice                 [Page 13]

RFC 3205                     HTTP Layering                 February 2002


13.  Full Copyright Statement

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Moore                    Best Current Practice                 [Page 14]


Added doc/rfc3230.txt.




























































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                           J. Mogul
Request for Comments: 3230                                    Compaq WRL
Category: Standards Track                                    A. Van Hoff
                                                                 Marimba
                                                            January 2002


                        Instance Digests in HTTP

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

Abstract

   HTTP/1.1 defines a Content-MD5 header that allows a server to include
   a digest of the response body.  However, this is specifically defined
   to cover the body of the actual message, not the contents of the full
   file (which might be quite different, if the response is a Content-
   Range, or uses a delta encoding).  Also, the Content-MD5 is limited
   to one specific digest algorithm; other algorithms, such as SHA-1
   (Secure Hash Standard), may be more appropriate in some
   circumstances.  Finally, HTTP/1.1 provides no explicit mechanism by
   which a client may request a digest.  This document proposes HTTP
   extensions that solve these problems.

Table of Contents

   1 Introduction....................................................  2
        1.1 Other limitations of HTTP/1.1............................  3
   2 Goals...........................................................  4
   3 Terminology.....................................................  5
   4 Specification...................................................  6
        4.1 Protocol parameter specifications........................  6
             4.1.1 Digest algorithms.................................  6
        4.2 Instance digests.........................................  7
        4.3 Header specifications....................................  8
             4.3.1 Want-Digest.......................................  8
             4.3.2 Digest............................................  9
   5 Negotiation of Content-MD5......................................  9



Mogul, et. al.              Standards Track                     [Page 1]

RFC 3230                Instance Digests in HTTP            January 2002


   6 IANA Considerations............................................. 10
   7 Security Considerations......................................... 10
   8 Acknowledgements................................................ 10
   9 References...................................................... 10
   10 Authors' Addresses............................................. 12
   11 Full Copyright Statement....................................... 13

1 Introduction

   Although HTTP is typically layered over a reliable transport
   protocol, such as TCP, this does not guarantee reliable transport of
   information from sender to receiver.  Various problems, including
   undetected transmission errors, programming errors, corruption of
   stored data, and malicious intervention can cause errors in the
   transmitted information.

   A common approach to the problem of data integrity in a network
   protocol or distributed system, such as HTTP, is the use of digests,
   checksums, or hash values.  The sender computes a digest and sends it
   with the data; the recipient computes a digest of the received data,
   and then verifies the integrity of this data by comparing the
   digests.

   Checksums are used at virtually all layers of the IP stack.  However,
   different digest algorithms might be used at each layer, for reasons
   of computational cost, because the size and nature of the data being
   protected varies, and because the possible threats to data integrity
   vary.  For example, Ethernet uses a Cyclic Redundancy Check (CRC).
   The IPv4 protocol uses a ones-complement checksum over the IP header
   (but not the rest of the packet).  TCP uses a ones-complement
   checksum over the TCP header and data, and includes a "pseudo-header"
   to detect certain kinds of programming errors.

   HTTP/1.1 [4] includes a mechanism for ensuring message integrity, the
   Content-MD5 header.  This header is actually defined for MIME-
   conformant messages in a standalone specification [10].  According to
   the HTTP/1.1 specification,

      The Content-MD5 entity-header field [...]  is an MD5 digest of the
      entity-body for the purpose of providing an end-to-end message
      integrity check (MIC) of the entity-body.

   HTTP/1.1 borrowed Content-MD5 from the MIME world based on an analogy
   between MIME messages (e.g., electronic mail messages) and HTTP
   messages (requests to or responses from an HTTP server).






Mogul, et. al.              Standards Track                     [Page 2]

RFC 3230                Instance Digests in HTTP            January 2002


   As discussed in more detail in section 3, this analogy between MIME
   messages and HTTP messages has resulted in some confusion.  In
   particular, while a MIME message is self-contained, an HTTP message
   might not contain the entire representation of the current state of a
   resource.  (More precisely, an HTTP response might not contain an
   entire "instance"; see section 3 for a definition of this term.)

   There are at least two situations where this distinction is an issue:

      1. When an HTTP server sends a 206 (Partial Content) response, as
         defined in HTTP/1.1.  The client may form its view of an
         instance (e.g., an HTML document) by combining a cache entry
         with the partial content in the message.

      2. When an HTTP server uses a "delta encoding", as proposed in a
         separate document [9].  A delta encoding represents the changes
         between the current instance of a resource and a previous
         instance, and is an efficient way of reducing the bandwidth
         required for cache updates.  The client forms its view of an
         instance by applying the delta in the message to one of its
         cache entries.

   We include these two kinds of transformations in a potentially
   broader category we call "instance manipulations."

   In each of these cases, the server might use a Content-MD5 header to
   protect the integrity of the response message.  However, because the
   MIC in a Content-MD5 header field applies only to the entity in that
   message, and not to the entire instance being reassembled, it cannot
   protect against errors due to data corruption (e.g., of cache
   entries), programming errors (e.g., improper application of a partial
   content or delta), certain malicious attacks [9], or corruption of
   certain HTTP headers in transit.

   Thus, the Content-MD5 header, while useful and sufficient in many
   cases, is not sufficient for verifying instance integrity in all uses
   of HTTP.

   The Digest Authentication mechanism [5] provides (in addition to its
   other goals) a message-digest function similar to Content-MD5, except
   that it includes certain header fields.  Like Content-MD5, it covers
   a specific message, not an entire instance.

1.1 Other limitations of HTTP/1.1

   Checksums are not free.  Computing a digest takes CPU resources, and
   might add latency to the generation of a message.  (Some of these
   costs can be avoided by careful caching at the sender's end, but in



Mogul, et. al.              Standards Track                     [Page 3]

RFC 3230                Instance Digests in HTTP            January 2002


   many cases such a cache would not have a useful hit ratio.)
   Transmitting a digest consumes HTTP header space (and therefore
   increases latency and network bandwidth requirements.)  If the
   message recipient does not intend to use the digest, why should the
   message sender waste resources computing and sending it?

   The Content-MD5 header, of course, implies the use of the MD5
   algorithm [15].  Other algorithms, however, might be more appropriate
   for some purposes.  These include the SHA-1 algorithm [12] and
   various "fingerprinting" algorithms [7].  HTTP currently provides no
   standardized support for the use of these algorithms.

   HTTP/1.1 apparently assumes that the choice to generate a digest is
   up to the sender, and provides no mechanism for the recipient to
   indicate whether a checksum would be useful, or what checksum
   algorithms it would understand.

2 Goals

   The goals of this proposal are:

      1. Digest coverage for entire instances communicated via HTTP.

      2. Support for multiple digest algorithms.

      3. Negotiation of the use of digests.

   The goals do not include:

      -  header integrity
         The digest mechanisms described here cover only the bodies of
         instances, and do not protect the integrity of associated
         "entity headers" or other message headers.

      -  authentication
         The digest mechanisms described here are not meant to support
         authentication of the source of a digest or of a message or
         instance.  These mechanisms, therefore, are not sufficient
         defense against many kinds of malicious attacks.

      -  privacy
         Digest mechanisms do not provide message privacy.

      -  authorization
         The digest mechanisms described here are not meant to support
         authorization or other kinds of access controls.





Mogul, et. al.              Standards Track                     [Page 4]

RFC 3230                Instance Digests in HTTP            January 2002


   The Digest Access Authentication mechanism [5] can provide some
   integrity for certain HTTP headers, and does provide authentication.

3 Terminology

   HTTP/1.1 [4] defines the following terms:

   resource          A network data object or service that can be
                     identified by a URI, as defined in section 3.2.
                     Resources may be available in multiple
                     representations (e.g. multiple languages, data
                     formats, size, resolutions) or vary in other ways.

   entity            The information transferred as the payload of a
                     request or response.  An entity consists of
                     metainformation in the form of entity-header fields
                     and content in the form of an entity-body, as
                     described in section 7.

   variant           A resource may have one, or more than one,
                     representation(s) associated with it at any given
                     instant.  Each of these representations is termed a
                     `variant.' Use of the term `variant' does not
                     necessarily imply that the resource is subject to
                     content negotiation.

   The dictionary definition for "entity" is "something that has
   separate and distinct existence and objective or conceptual reality"
   [8].  Unfortunately, the definition for "entity" in HTTP/1.1 is
   similar to that used in MIME [6], based on an entirely false analogy
   between MIME and HTTP.

   In MIME, electronic mail messages do have distinct and separate
   existences. MIME defines "entity" as something that "refers
   specifically to the MIME-defined header fields and contents of either
   a message or one of the parts in the body of a multipart entity."

   In HTTP, however, a response message to a GET does not have a
   distinct and separate existence.  Rather, it is describing the
   current state of a resource (or a variant, subject to a set of
   constraints).  The HTTP/1.1 specification provides no term to
   describe "the value that would be returned in response to a GET
   request at the current time for the selected variant of the specified
   resource."  This leads to awkward wordings in the HTTP/1.1
   specification in places where this concept is necessary.






Mogul, et. al.              Standards Track                     [Page 5]

RFC 3230                Instance Digests in HTTP            January 2002


   It is too late to fix the terminological failure in the HTTP/1.1
   specification, so we instead define a new term, for use in this
   document:

   instance          The entity that would be returned in a status-200
                     response to a GET request, at the current time, for
                     the selected variant of the specified resource,
                     with the application of zero or more content-
                     codings, but without the application of any
                     instance manipulations or transfer-codings.

   It is convenient to think of an entity tag, in HTTP/1.1, as being
   associated with an instance, rather than an entity.  That is, for a
   given resource, two different response messages might include the
   same entity tag, but two different instances of the resource should
   never be associated with the same (strong) entity tag.

   We also define this term:

   instance manipulation
                     An operation on one or more instances which may
                     result in an instance being conveyed from server to
                     client in parts, or in more than one response
                     message.  For example, a range selection or a delta
                     encoding.  Instance manipulations are end-to-end,
                     and often involve the use of a cache at the client.

4 Specification

   In this specification, the key words "MUST", "MUST NOT", "SHOULD",
   "SHOULD NOT", and "MAY" are to be interpreted as described in RFC
   2119 [2].

4.1 Protocol parameter specifications

4.1.1 Digest algorithms

   Digest algorithm values are used to indicate a specific digest
   computation.  For some algorithms, one or more parameters may be
   supplied.

      digest-algorithm = token

   The BNF for "parameter" is as is used in RFC 2616 [4].  All digest-
   algorithm values are case-insensitive.






Mogul, et. al.              Standards Track                     [Page 6]

RFC 3230                Instance Digests in HTTP            January 2002


   The Internet Assigned Numbers Authority (IANA) acts as a registry for
   digest-algorithm values.  Initially, the registry contains the
   following tokens:

   MD5               The MD5 algorithm, as specified in RFC 1321 [15].
                     The output of this algorithm is encoded using the
                     base64 encoding [1].

   SHA               The SHA-1 algorithm [12].  The output of this
                     algorithm is encoded using the base64 encoding [1].

   UNIXsum           The algorithm computed by the UNIX "sum" command,
                     as defined by the Single UNIX Specification,
                     Version 2 [13].  The output of this algorithm is an
                     ASCII decimal-digit string representing the 16-bit
                     checksum, which is the first word of the output of
                     the UNIX "sum" command.

   UNIXcksum         The algorithm computed by the UNIX "cksum" command,
                     as defined by the Single UNIX Specification,
                     Version 2 [13].  The output of this algorithm is an
                     ASCII digit string representing the 32-bit CRC,
                     which is the first word of the output of the UNIX
                     "cksum" command.

   If other digest-algorithm values are defined, the associated encoding
   MUST either be represented as a quoted string, or MUST NOT include
   ";" or "," in the character sets used for the encoding.

4.2 Instance digests

   An instance digest is the representation of the output of a digest
   algorithm, together with an indication of the algorithm used (and any
   parameters).

       instance-digest = digest-algorithm "="
                               <encoded digest output>

   The digest is computed on the entire instance associated with the
   message.  The instance is a snapshot of the resource prior to the
   application of of any instance manipulation or transfer-coding (see
   section 3).  The byte order used to compute the digest is the
   transmission byte order defined for the content-type of the instance.








Mogul, et. al.              Standards Track                     [Page 7]

RFC 3230                Instance Digests in HTTP            January 2002


      Note: the digest is computed before the application of any
      instance manipulation.  If a range or a delta-coding [9] is used,
      the computation of the digest after the computation of the range
      or delta would not provide a digest useful for checking the
      integrity of the reassembled instance.

   The encoded digest output uses the encoding format defined for the
   specific digest-algorithm.  For example, if the digest-algorithm is
   "MD5", the encoding is base64; if the digest-algorithm is "UNIXsum",
   the encoding is an ASCII string of decimal digits.

   Examples:

      MD5=HUXZLQLMuI/KZ5KDcJPcOA==
      sha=thvDyvhfIqlvFe+A9MYgxAfm1q5=
      UNIXsum=30637

4.3 Header specifications

   The following headers are defined.

4.3.1 Want-Digest

   The Want-Digest message header field indicates the sender's desire to
   receive an instance digest on messages associated with the Request-
   URI.

       Want-Digest = "Want-Digest" ":"
                        #(digest-algorithm [ ";" "q" "=" qvalue])

   If a digest-algorithm is not accompanied by a qvalue, it is treated
   as if its associated qvalue were 1.0.

   The sender is willing to accept a digest-algorithm if and only if it
   is listed in a Want-Digest header field of a message, and its qvalue
   is non-zero.

   If multiple acceptable digest-algorithm values are given, the
   sender's preferred digest-algorithm is the one (or ones) with the
   highest qvalue.

   Examples:

      Want-Digest: md5
      Want-Digest: MD5;q=0.3, sha;q=1






Mogul, et. al.              Standards Track                     [Page 8]

RFC 3230                Instance Digests in HTTP            January 2002


4.3.2 Digest

   The Digest message header field provides a message digest of the
   instance described by the message.

      Digest = "Digest" ":" #(instance-digest)

   The instance described by a message might be fully contained in the
   message-body, partially-contained in the message-body, or not at all
   contained in the message-body.  The instance is specified by the
   Request-URI and any cache-validator contained in the message.

   A Digest header field MAY contain multiple instance-digest values.
   This could be useful for responses expected to reside in caches
   shared by users with different browsers, for example.

   A recipient MAY ignore any or all of the instance-digests in a Digest
   header field.

   A sender MAY send an instance-digest using a digest-algorithm without
   knowing whether the recipient supports the digest-algorithm, or even
   knowing that the recipient will ignore it.

   Examples:

      Digest: md5=HUXZLQLMuI/KZ5KDcJPcOA==
      Digest: SHA=thvDyvhfIqlvFe+A9MYgxAfm1q5=,unixsum=30637

5 Negotiation of Content-MD5

   HTTP/1.1 provides a Content-MD5 header field, but does not provide
   any mechanism for requesting its use (or non-use).  The Want-Digest
   header field defined in this document provides the basis for such a
   mechanism.

   First, we add to the set of digest-algorithm values (in section
   4.1.1) the token "contentMD5", with the provision that this digest-
   algorithm MUST NOT be used in a Digest header field.

   The presence of the "contentMD5" digest-algorithm with a non-zero
   qvalue in a Want-Digest header field indicates that the sender wishes
   to receive a Content-MD5 header on messages associated with the
   Request-URI.

   The presence of the "contentMD5" digest-algorithm with a zero qvalue
   in a Want-Digest header field indicates that the sender will ignore
   Content-MD5 headers on messages associated with the Request-URI.




Mogul, et. al.              Standards Track                     [Page 9]

RFC 3230                Instance Digests in HTTP            January 2002


6 IANA Considerations

   The Internet Assigned Numbers Authority (IANA) administers the name
   space for digest-algorithm values.  Values and their meaning must be
   documented in an RFC or other peer-reviewed, permanent, and readily
   available reference, in sufficient detail so that interoperability
   between independent implementations is possible.  Subject to these
   constraints, name assignments are First Come, First Served (see RFC
   2434 [11]).

7 Security Considerations

   This document specifies a data integrity mechanism that protects HTTP
   instance data, but not HTTP entity headers, from certain kinds of
   accidental corruption.  It is also useful in detecting at least one
   spoofing attack [9].  However, it is not intended as general
   protection against malicious tampering with HTTP messages.

   The HTTP Digest Access Authentication mechanism [5] provides some
   protection against malicious tampering.

8 Acknowledgements

   It is not clear who first realized that the Content-MD5 header field
   is not sufficient to provide data integrity when ranges or deltas are
   used.

   Laurent Demailly may have been the first to suggest an algorithm-
   independent checksum header for HTTP [3].  Dave Raggett suggested the
   use of the term "digest" instead of "checksum" [14].

9 References

   [1]  Freed, N. and N. Borenstein, N., "MIME (Multipurpose Internet
        Mail Extensions) Part One:  Mechanisms for Specifying and
        Describing the Format of Internet Message Bodies", RFC 2049,
        November 1996.

   [2]  Bradner, S., "Key words for use in RFCs to Indicate Requirement
        Levels", BCP 14, RFC 2119, March 1997.

   [3]  Laurent Demailly.  Re: Revised Charter.
        http://www.ics.uci.edu/pub/ietf/http/hypermail/1995q4/0165.html.

   [4]  Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
        Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
        HTTP/1.1.", RFC 2616, June 1999.




Mogul, et. al.              Standards Track                    [Page 10]

RFC 3230                Instance Digests in HTTP            January 2002


   [5]  Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
        Leach, P., Luotonen, A. and L. Stewart, "HTTP Authentication:
        Basic and Digest Access Authentication", RFC 2617, June 1999.

   [6]  Freed, N. and N. Borenstein, "Multipurpose Internet Mail
        Extensions (MIME) Part One: Format of Internet Message Bodies",
        RFC 2045, November 1996.

   [7]  Nevin Heintze.  Scalable Document Fingerprinting.  Proc. Second
        USENIX Workshop on Electronic Commerce, USENIX, Oakland, CA,
        November, 1996, pp. 191-200.
        http://www.cs.cmu.edu/afs/cs/user/nch/www/koala/main.html.

   [8]  Merriam-Webster.  Webster's Seventh New Collegiate Dictionary.
        G. & C. Merriam Co., Springfield, MA, 1963.

   [9]  Mogul, J., Krishnamurthy, B., Douglis, F., Feldmann, A., Goland,
        Y. and A. van Hoff, "Delta encoding in HTTP", RFC 3229, December
        2001.

   [10] Myers, J. and M. Rose, "The Content-MD5 Header Field", RFC 1864,
        October 1995.

   [11] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA
        Considerations Section in RFCs", BCP 26, RFC 2434, October 1998.

   [12] National Institute of Standards and Technology.  Secure Hash
        Standard.  FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION
        180-1, U.S. Department of Commerce, April, 1995.
        http://csrc.nist.gov/fips/fip180-1.txt.

   [13] The Open Group.  The Single UNIX Specification, Version 2 - 6
        Vol Set for UNIX 98.  Document number T912, The Open Group,
        February, 1997.

   [14] Dave Raggett.  Re: Revised Charter.
        http://www.ics.uci.edu/pub/ietf/http/hypermail/1995q4/0182.html.

   [15] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April
        1992.











Mogul, et. al.              Standards Track                    [Page 11]

RFC 3230                Instance Digests in HTTP            January 2002


10 Authors' Addresses

   Jeffrey C. Mogul
   Western Research Laboratory
   Compaq Computer Corporation
   250 University Avenue
   Palo Alto, California, 94305, U.S.A.

   EMail: JeffMogul@acm.org
   Phone: 1 650 617 3304 (email preferred)

   Arthur van Hoff
   Marimba, Inc.
   440 Clyde Avenue
   Mountain View, CA 94043

   EMail: avh@marimba.com
   Phone: 1 (650) 930 5283

































Mogul, et. al.              Standards Track                    [Page 12]

RFC 3230                Instance Digests in HTTP            January 2002


11 Full Copyright Statement

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Mogul, et. al.              Standards Track                    [Page 13]


Added doc/rfc3305.txt.












































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                   M. Mealling, Ed.
Request for Comments: 3305                             R. Denenberg, Ed.
Category: Informational                           W3C URI Interest Group
                                                             August 2002


      Report from the Joint W3C/IETF URI Planning Interest Group:
 Uniform Resource Identifiers (URIs), URLs, and Uniform Resource Names
              (URNs): Clarifications and Recommendations

Status of this Memo


   This memo provides information for the Internet community.  It does
   not specify an Internet standard of any kind.  Distribution of this
   memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

Abstract

   This document, a product of the W3C Uniform Resource Identifier (URI)
   Interest Group, addresses and attempts to clarify issues pertaining
   to URIs.  This document addresses how URI space is partitioned and
   the relationship between URIs, URLs, and URNs, describes how URI
   schemes and URN namespaces ids are registered, and presents
   recommendations for continued work on this subject.






















Mealling & Denenberg         Informational                      [Page 1]

RFC 3305                  URIs, URLs, and URNs               August 2002


Table of Contents

   1.      The W3C URI Interest Group . . . . . . . . . . . . . . . .  2
   2.      URI Partitioning . . . . . . . . . . . . . . . . . . . . .  2
   2.1     Classical View . . . . . . . . . . . . . . . . . . . . . .  3
   2.2     Contemporary View  . . . . . . . . . . . . . . . . . . . .  3
   2.3     Confusion  . . . . . . . . . . . . . . . . . . . . . . . .  3
   3.      Registration . . . . . . . . . . . . . . . . . . . . . . .  4
   3.1     URI Schemes  . . . . . . . . . . . . . . . . . . . . . . .  4
   3.1.1   Registered URI schemes . . . . . . . . . . . . . . . . . .  4
   3.1.2   Unregistered URI Schemes . . . . . . . . . . . . . . . . .  4
   3.1.2.1 Public Unregistered Schemes  . . . . . . . . . . . . . . .  4
   3.1.2.2 Private Schemes  . . . . . . . . . . . . . . . . . . . . .  5
   3.1.3   Registration of URI Schemes  . . . . . . . . . . . . . . .  5
   3.1.3.1 IETF Tree  . . . . . . . . . . . . . . . . . . . . . . . .  5
   3.1.3.2 Other Trees  . . . . . . . . . . . . . . . . . . . . . . .  5
   3.2     URN Namespaces . . . . . . . . . . . . . . . . . . . . . .  5
   3.2.1   Registered URN NIDs  . . . . . . . . . . . . . . . . . . .  5
   3.2.2   Pending URN NIDs . . . . . . . . . . . . . . . . . . . . .  6
   3.2.3   Unregistered NIDs  . . . . . . . . . . . . . . . . . . . .  7
   3.2.4   Registration Procedures for URN NIDs . . . . . . . . . . .  7
   4.      Additional URI Issues  . . . . . . . . . . . . . . . . . .  7
   5.      Recommendations  . . . . . . . . . . . . . . . . . . . . .  8
   6.      Security Considerations  . . . . . . . . . . . . . . . . .  8
   7.      Acknowledgements . . . . . . . . . . . . . . . . . . . . .  8
           References . . . . . . . . . . . . . . . . . . . . . . . .  9
           Authors' Addresses . . . . . . . . . . . . . . . . . . . . 10
           Full Copyright Statement . . . . . . . . . . . . . . . . . 11

1. The W3C URI Interest Group

   In October, 2000 the W3C formed a planning group whose mission was to
   evaluate the opportunities for W3C work in the area of Uniform
   Resource Identifiers (URIs) and to develop a proposal for continued
   work in this area.  The Interest Group was composed of W3C members
   and invited experts from the IETF to participate as well.  This
   document is a set of recommendations from this group, to the W3C and
   the IETF for work that can and should continue in this area.

2. URI Partitioning

   There is some confusion in the web community over the partitioning of
   URI space, specifically, the relationship among the concepts of URL,
   URN, and URI.  The confusion owes to the incompatibility between two
   different views of URI partitioning, which we call the "classical"
   and "contemporary" views.





Mealling & Denenberg         Informational                      [Page 2]

RFC 3305                  URIs, URLs, and URNs               August 2002


2.1 Classical View

   During the early years of discussion of web identifiers (early to mid
   90s), people assumed that an identifier type would be cast into one
   of two (or possibly more) classes.  An identifier might specify the
   location of a resource (a URL) or its name (a URN), independent of
   location.  Thus a URI was either a URL or a URN.  There was
   discussion about generalizing this by the addition of a discrete
   number of additional classes; for example, a URI might point to
   metadata rather than the resource itself, in which case the URI would
   be a URC (citation).  URI space was thus viewed as partitioned into
   subspaces:  URL, URN, and additional subspaces to be defined.  The
   only such additional space ever proposed was Uniform Resource
   Characteristics (URC) and there never was any buy-in; so without loss
   of generality, it's reasonable to say that URI space was thought to
   be partitioned into two classes: URL and URN.  Thus, for example,
   "http:" was a URL scheme, and "isbn:" would (someday) be a URN
   scheme.  Any new scheme would be cast into one of these two classes.

2.2 Contemporary View

   Over time, the importance of this additional level of hierarchy
   seemed to lessen; the view became that an individual scheme did not
   need to be cast into one of a discrete set of URI types, such as
   "URL", "URN", "URC", etc.  Web-identifier schemes are, in general,
   URI schemes, as a given URI scheme may define subspaces.  Thus
   "http:" is a URI scheme.  "urn:" is also a URI scheme; it defines
   subspaces, called "namespaces".  For example, the set of URNs, of the
   form "urn:isbn:n-nn-nnnnnn-n", is a URN namespace.  ("isbn" is an URN
   namespace identifier.  It is not a "URN scheme", nor is it a "URI
   scheme.")

   Further, according to the contemporary view, the term "URL" does not
   refer to a formal partition of URI space; rather, URL is a useful but
   informal concept.  A URL is a type of URI that identifies a resource
   via a representation of its primary access mechanism (e.g., its
   network "location"), rather than by some other attributes it may
   have.  Thus, as we noted, "http:" is a URI scheme.  An http URI is a
   URL.  The phrase "URL scheme" is now used infrequently, usually to
   refer to some subclass of URI schemes which exclude URNs.

2.3 Confusion

   The body of documents (RFCs, etc) covering URI architecture, syntax,
   registration, etc., spans both the classical and contemporary
   periods.  People who are well-versed in URI matters tend to use "URL"
   and "URI" in ways that seem to be interchangeable.  Among these
   experts, this isn't a problem, but among the Internet community at



Mealling & Denenberg         Informational                      [Page 3]

RFC 3305                  URIs, URLs, and URNs               August 2002


   large, it is a problem.  People are not convinced that URI and URL
   mean the same thing, in documents where they (apparently) do.  When
   one RFC talks about URI schemes (e.g. "URI Syntax" (RFC 2396) [12]),
   another talks about URL schemes (e.g. "Registration Procedures for
   URL Schemes" (RFC 2717) [1]), and yet another talks of URN schemes
   ("Architectural Principles of URN Resolution" (RFC 2276) [13]), it is
   natural to wonder how they difference, and how they relate to one
   another.  While RFC 2396, section 1.2, attempts to address the
   distinction between URIs, URLs and URNs, it has not been successful
   in clearing up the confusion.

3. Registration

   This section examines the state of registration of URI schemes and
   URN namespaces and the mechanisms by which registration currently
   occurs.

3.1 URI Schemes

3.1.1 Registered URI schemes

   The official register of URI scheme names is maintained by IANA, at
   http://www.iana.org/assignments/uri-schemes.  For each scheme, the
   RFC that defines the scheme is listed; for example "http:" is defined
   by RFC2616 [14].  The table lists  34 schemes (at time of publication
   of this RFC).  In addition, there are a few "reserved" scheme names;
   at one point in time, these were intended to become registered
   schemes but have since been dropped.

3.1.2 Unregistered URI Schemes

   We distinguish between public (unregistered) and private schemes.  A
   public scheme (registered or not) is one for which there is some
   public document describing it.

3.1.2.1 Public Unregistered Schemes

   Dan Conolly's paper, at http://www.w3.org/Addressing/schemes,
   provides a list of known public URI schemes, both registered and un-
   registered, a total of 85 schemes at time of publication of this RFC.
   50 or so of these are unregistered (not listed in the IANA register).
   Some of these URI schemes are obsolete (for example, "phone" is
   obsolete, superceded by "tel"), while some have an RFC, but are not
   included in the IANA list.







Mealling & Denenberg         Informational                      [Page 4]

RFC 3305                  URIs, URLs, and URNs               August 2002


3.1.2.2 Private Schemes

   It is probably impossible to determine all of these, and it's not
   clear that it's worthwhile to try, except perhaps to get some idea of
   their number.  In the minutes of the August 1997 IETF meeting is the
   observation that there may be 20-40 in use at Microsoft, with 2-3
   being added a day, and that WebTV has 24, with 6 added per year.

3.1.3 Registration of URI Schemes

   "Registration Procedures for URL Scheme Names" (RFC 2717) [1]
   specifies procedures for registering scheme names and points to
   "Guidelines for new URL Schemes" (RFC 2718) [2], which supplies
   guidelines.  RFC 2717 describes an organization of schemes into
   "trees".  It is important to note that these two documents use the
   historical term 'URL' when in fact, they refer to URIs in general.
   In fact, one of the recommended tasks in Section 5 is for these
   documents to be updated to use the term 'URI' instead of 'URL'.

3.1.3.1 IETF Tree

   The IETF tree is intended for schemes of general interest to the
   Internet community, and for those which require a substantive review
   and approval process.  Registration in the IETF tree requires
   publication of the scheme syntax and semantics in an RFC.

3.1.3.2 Other Trees

   Although RFC 2717 describes "alternative trees", no alternative trees
   have been registered to date, although a vendor-supplied tree ("vnd")
   is pending.  URI schemes in alternative trees will be distinguished
   because they will have a "." in the scheme name.

3.2 URN Namespaces

   A URN namespace is identified by a "Namespace ID" (NID), which is
   registered with IANA (see Section 3.2.4).

3.2.1 Registered URN NIDs

   There are two categories of registered URN NIDs:

   o  Informal: These are of the form, "urn-<number>", where <number> is
      assigned by IANA.  There are four registered (at time of
      publication of this RFC) in this category  (urn-1, urn-2,  urn-3,
      and urn-4).





Mealling & Denenberg         Informational                      [Page 5]

RFC 3305                  URIs, URLs, and URNs               August 2002


   o  Formal: The official list of registered NIDs is kept by IANA at
      http://www.iana.org/assignments/urn-namespaces.  At the time of
      publication of this RFC it lists ten registered NIDs:

      *  'ietf', defined by "URN Namespace for IETF Documents" (RFC
         2648) [3]

      *  'pin', defined by "The Network Solutions Personal Internet Name
         (PIN): A URN Namespace for People and Organizations" (RFC 3043)
         [4]

      *  'issn' defined by "Using The ISSN as URN within an ISSN-URN
         Namespace" (RFC 3043) [4]

      *  'oid' defined by "A URN Namespace of Object Identifiers" (RFC
         3061) [6]

      *  'newsml' defined by "URN Namespace for NewsML Resources" (RFC
         3085) [7]

      *  'oasis' defined by "A URN Namespace for OASIS" (RFC 3121) [8]

      *  'xmlorg' defined by "A URN Namespace for XML.org" (RFC 3120)
         [9]

      *  'publicid' defined by "A URN Namespace for Public Identifiers"
         (RFC 3151) [10]

      *  'isbn' defined by "Using International Standard Book Numbers as
         Uniform Resource Names" (RFC 3187) [15]

      *  'nbn' defined by "Using National Bibliography Numbers as
         Uniform Resource Names" (RFC 3188) [16]

3.2.2 Pending URN NIDs

   There are a number of pending URN NID registration requests, but
   there is no reliable way to discover them, or their status.  It would
   be helpful if there were some formal means to track the status of NID
   requests such as 'isbn'.











Mealling & Denenberg         Informational                      [Page 6]

RFC 3305                  URIs, URLs, and URNs               August 2002


3.2.3 Unregistered NIDs

   In the "unregistered" category (besides the experimental case, not
   described in this paper), there are entities that maintain namespaces
   that, while completely appropriate as URNs, just haven't bothered to
   explore the process of NID registration.  The most prominent that
   comes to mind is 'hdl'.  In the case of 'hdl', it has been speculated
   that this scheme has not been registered because it is not clear to
   the owners whether it should be registered as a URI scheme or as a
   URN namespace.

3.2.4 Registration Procedures for URN NIDs

   "URN Namespace Definition Mechanisms" (RFC 2611) [11] describes the
   mechanism to obtain an NID for a URN namespace, which is registered
   with IANA.

   A request for an NID should describe features including: structural
   characteristic of identifiers (for example, features relevant to
   caching/shortcuts approaches); specific character encoding rules
   (e.g., which character should be used for single-quotes); RFCs,
   standards, etc, that explain the namespace structure; identifier
   uniqueness considerations; delegation of assignment authority,
   including how to become an assigner of identifiers; identifier
   persistence considerations; quality of service considerations;
   process for identifier resolution; rules for lexical equivalence; any
   special considerations required for conforming with the URN syntax
   (particularly applicable in the case of legacy naming systems);
   validation mechanisms (determining whether a given string is
   currently a validly-assigned URN); and scope (for example,"United
   States social security numbers").

4. Additional URI Issues

   There are additional unresolved URI issues not considered by this
   paper, which we hope will be addressed by a follow-on effort.  We
   have not attempted to completely enumerate these issues, however,
   they include (but are not limited to) the following:

   o  The use of URIs as identifiers that don't actually identify
      network resources (for example, they identify an abstract object,
      such as an XML namespace, or a physical object such as a book or
      even a person).

   o  IRIs (International Resource Identifiers): the extension of URI
      syntax to non-ASCII.





Mealling & Denenberg         Informational                      [Page 7]

RFC 3305                  URIs, URLs, and URNs               August 2002


5. Recommendations

   We recommend the following:

   1. The W3C and IETF should jointly develop and endorse a model for
      URIs, URLs, and URNs consistent with the "Contemporary View"
      described in section 1, and which considers the additional URI
      issues listed or alluded to in section 3.

   2. RFCs such as 2717 ("Registration Procedures for URL Scheme Names")
      and 2718 ("Guidelines for new URL Schemes") should both be
      generalized to refer to "URI schemes", rather than "URL schemes"
      and, after refinement, moved forward as Best Current Practices in
      the IETF.

   3. The registration procedures for alternative trees should be
      clarified in RFC 2717.

   4. Public, but unregistered schemes, should become registered, where
      possible.  Obsolete schemes should be purged or clearly marked as
      obsolete.

   5. IANA registration information should be updated:

      *  Add 'urn' to the list of registered URI schemes with a pointer
         to the URN namespace registry.

      *  Maintain status information about pending registrations (URI
         schemes and URN NID requests ).

      *  Insure that it is clear that the page is the official registry,
         e.g., by adding a heading to the effect "This is the Official
         IANA Registry of URI Schemes".

6. Security Considerations

   This memo does not raise any known security threats.

7. Acknowledgements

   The participants in the URI Planning Interest Group are:

   o  Tony Coates

   o  Dan Connolly

   o  Diana Dack




Mealling & Denenberg         Informational                      [Page 8]

RFC 3305                  URIs, URLs, and URNs               August 2002


   o  Leslie Daigle

   o  Ray Denenberg

   o  Martin Duerst

   o  Paul Grosso

   o  Sandro Hawke

   o  Renato Iannella

   o  Graham Klyne

   o  Larry Masinter

   o  Michael Mealling

   o  Mark Needleman

   o  Norman Walsh

References

   [1]  Petke, R. and I. King, "Registration Procedures for URL Scheme
        Names", BCP 35, RFC 2717, November 1999.

   [2]  Masinter, L., Alvestrand, H., Zigmond, D. and R. Petke,
        "Guidelines for new URL Schemes", RFC 2718, November 1999.

   [3]  Moats, R., "A URN Namespace for IETF Documents", RFC 2648,
        August 1999.

   [4]  Mealling, M., "The Network Solutions Personal Internet Name
        (PIN): A URN Namespace for People and Organizations", RFC 3043,
        January 2001.

   [5]  Rozenfeld, S., "Using The ISSN (International Serial Standard
        Number) as URN (Uniform Resource Names) within an ISSN-URN
        Namespace", RFC 3044, January 2001.

   [6]  Mealling, M., "A URN Namespace of Object Identifiers", RFC 3061,
        February 2001.

   [7]  Coates, A., Allen, D. and D. Rivers-Moore, "URN Namespace for
        NewsML Resources", RFC 3085, March 2001.





Mealling & Denenberg         Informational                      [Page 9]

RFC 3305                  URIs, URLs, and URNs               August 2002


   [8]  Best, K. and N. Walsh, "A URN Namespace for OASIS", RFC 3121,
        June 2001.

   [9]  Best, K. and N. Walsh, "A URN Namespace for XML.org", RFC 3120,
        June 2001.

   [10] Walsh, N., Cowan, J. and P. Grosso, "A URN Namespace for Public
        Identifiers", RFC 3151, August 2001.

   [11] Daigle, L., van Gulik, D., Iannella, R. and P. Faltstrom, "URN
        Namespace Definition Mechanisms", BCP 33, RFC 2611, June 1999.

   [12] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource
        Identifiers (URI): Generic Syntax", RFC 2396, August 1998.

   [13] Sollins, K., "Architectural Principles of Uniform Resource Name
        Resolution", RFC 2276, January 1998.

   [14] Fielding, R., Gettys, J., Mogul, J., Nielsen, H., Masinter, L.,
        Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
        HTTP/1.1", RFC 2616, June 1999.

   [15] Hakala, J. and H. Walravens, "Using International Standard Book
        Numbers as Uniform Resource Names", RFC 3187, October 2001.

   [16] Hakala, J., "Using National Bibliography Numbers as Uniform
        Resource Names", RFC 3188, October 2001.

Authors' Addresses

   Michael Mealling
   VeriSign, Inc.
   21345 Ridgetop Circle
   Sterling, VA  20166
   US

   EMail: michael@verisignlabs.com


   Ray Denenberg
   Library of Congress
   Washington, DC  20540
   US

   EMail: rden@loc.gov






Mealling & Denenberg         Informational                     [Page 10]

RFC 3305                  URIs, URLs, and URNs               August 2002


Full Copyright Statement

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Mealling & Denenberg         Informational                     [Page 11]


Added doc/rfc3986.txt.




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                     T. Berners-Lee
Request for Comments: 3986                                       W3C/MIT
STD: 66                                                      R. Fielding
Updates: 1738                                               Day Software
Obsoletes: 2732, 2396, 1808                                  L. Masinter
Category: Standards Track                                  Adobe Systems
                                                            January 2005


           Uniform Resource Identifier (URI): Generic Syntax

Status of This Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2005).

Abstract

   A Uniform Resource Identifier (URI) is a compact sequence of
   characters that identifies an abstract or physical resource.  This
   specification defines the generic URI syntax and a process for
   resolving URI references that might be in relative form, along with
   guidelines and security considerations for the use of URIs on the
   Internet.  The URI syntax defines a grammar that is a superset of all
   valid URIs, allowing an implementation to parse the common components
   of a URI reference without knowing the scheme-specific requirements
   of every possible identifier.  This specification does not define a
   generative grammar for URIs; that task is performed by the individual
   specifications of each URI scheme.















Berners-Lee, et al.         Standards Track                     [Page 1]

RFC 3986                   URI Generic Syntax               January 2005


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  4
       1.1.  Overview of URIs . . . . . . . . . . . . . . . . . . . .  4
             1.1.1.  Generic Syntax . . . . . . . . . . . . . . . . .  6
             1.1.2.  Examples . . . . . . . . . . . . . . . . . . . .  7
             1.1.3.  URI, URL, and URN  . . . . . . . . . . . . . . .  7
       1.2.  Design Considerations  . . . . . . . . . . . . . . . . .  8
             1.2.1.  Transcription  . . . . . . . . . . . . . . . . .  8
             1.2.2.  Separating Identification from Interaction . . .  9
             1.2.3.  Hierarchical Identifiers . . . . . . . . . . . . 10
       1.3.  Syntax Notation  . . . . . . . . . . . . . . . . . . . . 11
   2.  Characters . . . . . . . . . . . . . . . . . . . . . . . . . . 11
       2.1.  Percent-Encoding . . . . . . . . . . . . . . . . . . . . 12
       2.2.  Reserved Characters  . . . . . . . . . . . . . . . . . . 12
       2.3.  Unreserved Characters  . . . . . . . . . . . . . . . . . 13
       2.4.  When to Encode or Decode . . . . . . . . . . . . . . . . 14
       2.5.  Identifying Data . . . . . . . . . . . . . . . . . . . . 14
   3.  Syntax Components  . . . . . . . . . . . . . . . . . . . . . . 16
       3.1.  Scheme . . . . . . . . . . . . . . . . . . . . . . . . . 17
       3.2.  Authority  . . . . . . . . . . . . . . . . . . . . . . . 17
             3.2.1.  User Information . . . . . . . . . . . . . . . . 18
             3.2.2.  Host . . . . . . . . . . . . . . . . . . . . . . 18
             3.2.3.  Port . . . . . . . . . . . . . . . . . . . . . . 22
       3.3.  Path . . . . . . . . . . . . . . . . . . . . . . . . . . 22
       3.4.  Query  . . . . . . . . . . . . . . . . . . . . . . . . . 23
       3.5.  Fragment . . . . . . . . . . . . . . . . . . . . . . . . 24
   4.  Usage  . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
       4.1.  URI Reference  . . . . . . . . . . . . . . . . . . . . . 25
       4.2.  Relative Reference . . . . . . . . . . . . . . . . . . . 26
       4.3.  Absolute URI . . . . . . . . . . . . . . . . . . . . . . 27
       4.4.  Same-Document Reference  . . . . . . . . . . . . . . . . 27
       4.5.  Suffix Reference . . . . . . . . . . . . . . . . . . . . 27
   5.  Reference Resolution . . . . . . . . . . . . . . . . . . . . . 28
       5.1.  Establishing a Base URI  . . . . . . . . . . . . . . . . 28
             5.1.1.  Base URI Embedded in Content . . . . . . . . . . 29
             5.1.2.  Base URI from the Encapsulating Entity . . . . . 29
             5.1.3.  Base URI from the Retrieval URI  . . . . . . . . 30
             5.1.4.  Default Base URI . . . . . . . . . . . . . . . . 30
       5.2.  Relative Resolution  . . . . . . . . . . . . . . . . . . 30
             5.2.1.  Pre-parse the Base URI . . . . . . . . . . . . . 31
             5.2.2.  Transform References . . . . . . . . . . . . . . 31
             5.2.3.  Merge Paths  . . . . . . . . . . . . . . . . . . 32
             5.2.4.  Remove Dot Segments  . . . . . . . . . . . . . . 33
       5.3.  Component Recomposition  . . . . . . . . . . . . . . . . 35
       5.4.  Reference Resolution Examples  . . . . . . . . . . . . . 35
             5.4.1.  Normal Examples  . . . . . . . . . . . . . . . . 36
             5.4.2.  Abnormal Examples  . . . . . . . . . . . . . . . 36



Berners-Lee, et al.         Standards Track                     [Page 2]

RFC 3986                   URI Generic Syntax               January 2005


   6.  Normalization and Comparison . . . . . . . . . . . . . . . . . 38
       6.1.  Equivalence  . . . . . . . . . . . . . . . . . . . . . . 38
       6.2.  Comparison Ladder  . . . . . . . . . . . . . . . . . . . 39
             6.2.1.  Simple String Comparison . . . . . . . . . . . . 39
             6.2.2.  Syntax-Based Normalization . . . . . . . . . . . 40
             6.2.3.  Scheme-Based Normalization . . . . . . . . . . . 41
             6.2.4.  Protocol-Based Normalization . . . . . . . . . . 42
   7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 43
       7.1.  Reliability and Consistency  . . . . . . . . . . . . . . 43
       7.2.  Malicious Construction . . . . . . . . . . . . . . . . . 43
       7.3.  Back-End Transcoding . . . . . . . . . . . . . . . . . . 44
       7.4.  Rare IP Address Formats  . . . . . . . . . . . . . . . . 45
       7.5.  Sensitive Information  . . . . . . . . . . . . . . . . . 45
       7.6.  Semantic Attacks . . . . . . . . . . . . . . . . . . . . 45
   8.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 46
   9.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 46
   10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 46
       10.1. Normative References . . . . . . . . . . . . . . . . . . 46
       10.2. Informative References . . . . . . . . . . . . . . . . . 47
   A.  Collected ABNF for URI . . . . . . . . . . . . . . . . . . . . 49
   B.  Parsing a URI Reference with a Regular Expression  . . . . . . 50
   C.  Delimiting a URI in Context  . . . . . . . . . . . . . . . . . 51
   D.  Changes from RFC 2396  . . . . . . . . . . . . . . . . . . . . 53
       D.1.  Additions  . . . . . . . . . . . . . . . . . . . . . . . 53
       D.2.  Modifications  . . . . . . . . . . . . . . . . . . . . . 53
   Index  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 60
   Full Copyright Statement . . . . . . . . . . . . . . . . . . . . . 61























Berners-Lee, et al.         Standards Track                     [Page 3]

RFC 3986                   URI Generic Syntax               January 2005


1.  Introduction

   A Uniform Resource Identifier (URI) provides a simple and extensible
   means for identifying a resource.  This specification of URI syntax
   and semantics is derived from concepts introduced by the World Wide
   Web global information initiative, whose use of these identifiers
   dates from 1990 and is described in "Universal Resource Identifiers
   in WWW" [RFC1630].  The syntax is designed to meet the
   recommendations laid out in "Functional Recommendations for Internet
   Resource Locators" [RFC1736] and "Functional Requirements for Uniform
   Resource Names" [RFC1737].

   This document obsoletes [RFC2396], which merged "Uniform Resource
   Locators" [RFC1738] and "Relative Uniform Resource Locators"
   [RFC1808] in order to define a single, generic syntax for all URIs.
   It obsoletes [RFC2732], which introduced syntax for an IPv6 address.
   It excludes portions of RFC 1738 that defined the specific syntax of
   individual URI schemes; those portions will be updated as separate
   documents.  The process for registration of new URI schemes is
   defined separately by [BCP35].  Advice for designers of new URI
   schemes can be found in [RFC2718].  All significant changes from RFC
   2396 are noted in Appendix D.

   This specification uses the terms "character" and "coded character
   set" in accordance with the definitions provided in [BCP19], and
   "character encoding" in place of what [BCP19] refers to as a
   "charset".

1.1.  Overview of URIs

   URIs are characterized as follows:

   Uniform

      Uniformity provides several benefits.  It allows different types
      of resource identifiers to be used in the same context, even when
      the mechanisms used to access those resources may differ.  It
      allows uniform semantic interpretation of common syntactic
      conventions across different types of resource identifiers.  It
      allows introduction of new types of resource identifiers without
      interfering with the way that existing identifiers are used.  It
      allows the identifiers to be reused in many different contexts,
      thus permitting new applications or protocols to leverage a pre-
      existing, large, and widely used set of resource identifiers.







Berners-Lee, et al.         Standards Track                     [Page 4]

RFC 3986                   URI Generic Syntax               January 2005


   Resource

      This specification does not limit the scope of what might be a
      resource; rather, the term "resource" is used in a general sense
      for whatever might be identified by a URI.  Familiar examples
      include an electronic document, an image, a source of information
      with a consistent purpose (e.g., "today's weather report for Los
      Angeles"), a service (e.g., an HTTP-to-SMS gateway), and a
      collection of other resources.  A resource is not necessarily
      accessible via the Internet; e.g., human beings, corporations, and
      bound books in a library can also be resources.  Likewise,
      abstract concepts can be resources, such as the operators and
      operands of a mathematical equation, the types of a relationship
      (e.g., "parent" or "employee"), or numeric values (e.g., zero,
      one, and infinity).

   Identifier

      An identifier embodies the information required to distinguish
      what is being identified from all other things within its scope of
      identification.  Our use of the terms "identify" and "identifying"
      refer to this purpose of distinguishing one resource from all
      other resources, regardless of how that purpose is accomplished
      (e.g., by name, address, or context).  These terms should not be
      mistaken as an assumption that an identifier defines or embodies
      the identity of what is referenced, though that may be the case
      for some identifiers.  Nor should it be assumed that a system
      using URIs will access the resource identified: in many cases,
      URIs are used to denote resources without any intention that they
      be accessed.  Likewise, the "one" resource identified might not be
      singular in nature (e.g., a resource might be a named set or a
      mapping that varies over time).

   A URI is an identifier consisting of a sequence of characters
   matching the syntax rule named <URI> in Section 3.  It enables
   uniform identification of resources via a separately defined
   extensible set of naming schemes (Section 3.1).  How that
   identification is accomplished, assigned, or enabled is delegated to
   each scheme specification.

   This specification does not place any limits on the nature of a
   resource, the reasons why an application might seek to refer to a
   resource, or the kinds of systems that might use URIs for the sake of
   identifying resources.  This specification does not require that a
   URI persists in identifying the same resource over time, though that
   is a common goal of all URI schemes.  Nevertheless, nothing in this





Berners-Lee, et al.         Standards Track                     [Page 5]

RFC 3986                   URI Generic Syntax               January 2005


   specification prevents an application from limiting itself to
   particular types of resources, or to a subset of URIs that maintains
   characteristics desired by that application.

   URIs have a global scope and are interpreted consistently regardless
   of context, though the result of that interpretation may be in
   relation to the end-user's context.  For example, "http://localhost/"
   has the same interpretation for every user of that reference, even
   though the network interface corresponding to "localhost" may be
   different for each end-user: interpretation is independent of access.
   However, an action made on the basis of that reference will take
   place in relation to the end-user's context, which implies that an
   action intended to refer to a globally unique thing must use a URI
   that distinguishes that resource from all other things.  URIs that
   identify in relation to the end-user's local context should only be
   used when the context itself is a defining aspect of the resource,
   such as when an on-line help manual refers to a file on the end-
   user's file system (e.g., "file:///etc/hosts").

1.1.1.  Generic Syntax

   Each URI begins with a scheme name, as defined in Section 3.1, that
   refers to a specification for assigning identifiers within that
   scheme.  As such, the URI syntax is a federated and extensible naming
   system wherein each scheme's specification may further restrict the
   syntax and semantics of identifiers using that scheme.

   This specification defines those elements of the URI syntax that are
   required of all URI schemes or are common to many URI schemes.  It
   thus defines the syntax and semantics needed to implement a scheme-
   independent parsing mechanism for URI references, by which the
   scheme-dependent handling of a URI can be postponed until the
   scheme-dependent semantics are needed.  Likewise, protocols and data
   formats that make use of URI references can refer to this
   specification as a definition for the range of syntax allowed for all
   URIs, including those schemes that have yet to be defined.  This
   decouples the evolution of identification schemes from the evolution
   of protocols, data formats, and implementations that make use of
   URIs.

   A parser of the generic URI syntax can parse any URI reference into
   its major components.  Once the scheme is determined, further
   scheme-specific parsing can be performed on the components.  In other
   words, the URI generic syntax is a superset of the syntax of all URI
   schemes.






Berners-Lee, et al.         Standards Track                     [Page 6]

RFC 3986                   URI Generic Syntax               January 2005


1.1.2.  Examples

   The following example URIs illustrate several URI schemes and
   variations in their common syntax components:

      ftp://ftp.is.co.za/rfc/rfc1808.txt

      http://www.ietf.org/rfc/rfc2396.txt

      ldap://[2001:db8::7]/c=GB?objectClass?one

      mailto:John.Doe@example.com

      news:comp.infosystems.www.servers.unix

      tel:+1-816-555-1212

      telnet://192.0.2.16:80/

      urn:oasis:names:specification:docbook:dtd:xml:4.1.2


1.1.3.  URI, URL, and URN

   A URI can be further classified as a locator, a name, or both.  The
   term "Uniform Resource Locator" (URL) refers to the subset of URIs
   that, in addition to identifying a resource, provide a means of
   locating the resource by describing its primary access mechanism
   (e.g., its network "location").  The term "Uniform Resource Name"
   (URN) has been used historically to refer to both URIs under the
   "urn" scheme [RFC2141], which are required to remain globally unique
   and persistent even when the resource ceases to exist or becomes
   unavailable, and to any other URI with the properties of a name.

   An individual scheme does not have to be classified as being just one
   of "name" or "locator".  Instances of URIs from any given scheme may
   have the characteristics of names or locators or both, often
   depending on the persistence and care in the assignment of
   identifiers by the naming authority, rather than on any quality of
   the scheme.  Future specifications and related documentation should
   use the general term "URI" rather than the more restrictive terms
   "URL" and "URN" [RFC3305].









Berners-Lee, et al.         Standards Track                     [Page 7]

RFC 3986                   URI Generic Syntax               January 2005


1.2.  Design Considerations

1.2.1.  Transcription

   The URI syntax has been designed with global transcription as one of
   its main considerations.  A URI is a sequence of characters from a
   very limited set: the letters of the basic Latin alphabet, digits,
   and a few special characters.  A URI may be represented in a variety
   of ways; e.g., ink on paper, pixels on a screen, or a sequence of
   character encoding octets.  The interpretation of a URI depends only
   on the characters used and not on how those characters are
   represented in a network protocol.

   The goal of transcription can be described by a simple scenario.
   Imagine two colleagues, Sam and Kim, sitting in a pub at an
   international conference and exchanging research ideas.  Sam asks Kim
   for a location to get more information, so Kim writes the URI for the
   research site on a napkin.  Upon returning home, Sam takes out the
   napkin and types the URI into a computer, which then retrieves the
   information to which Kim referred.

   There are several design considerations revealed by the scenario:

   o  A URI is a sequence of characters that is not always represented
      as a sequence of octets.

   o  A URI might be transcribed from a non-network source and thus
      should consist of characters that are most likely able to be
      entered into a computer, within the constraints imposed by
      keyboards (and related input devices) across languages and
      locales.

   o  A URI often has to be remembered by people, and it is easier for
      people to remember a URI when it consists of meaningful or
      familiar components.

   These design considerations are not always in alignment.  For
   example, it is often the case that the most meaningful name for a URI
   component would require characters that cannot be typed into some
   systems.  The ability to transcribe a resource identifier from one
   medium to another has been considered more important than having a
   URI consist of the most meaningful of components.

   In local or regional contexts and with improving technology, users
   might benefit from being able to use a wider range of characters;
   such use is not defined by this specification.  Percent-encoded
   octets (Section 2.1) may be used within a URI to represent characters
   outside the range of the US-ASCII coded character set if this



Berners-Lee, et al.         Standards Track                     [Page 8]

RFC 3986                   URI Generic Syntax               January 2005


   representation is allowed by the scheme or by the protocol element in
   which the URI is referenced.  Such a definition should specify the
   character encoding used to map those characters to octets prior to
   being percent-encoded for the URI.

1.2.2.  Separating Identification from Interaction

   A common misunderstanding of URIs is that they are only used to refer
   to accessible resources.  The URI itself only provides
   identification; access to the resource is neither guaranteed nor
   implied by the presence of a URI.  Instead, any operation associated
   with a URI reference is defined by the protocol element, data format
   attribute, or natural language text in which it appears.

   Given a URI, a system may attempt to perform a variety of operations
   on the resource, as might be characterized by words such as "access",
   "update", "replace", or "find attributes".  Such operations are
   defined by the protocols that make use of URIs, not by this
   specification.  However, we do use a few general terms for describing
   common operations on URIs.  URI "resolution" is the process of
   determining an access mechanism and the appropriate parameters
   necessary to dereference a URI; this resolution may require several
   iterations.  To use that access mechanism to perform an action on the
   URI's resource is to "dereference" the URI.

   When URIs are used within information retrieval systems to identify
   sources of information, the most common form of URI dereference is
   "retrieval": making use of a URI in order to retrieve a
   representation of its associated resource.  A "representation" is a
   sequence of octets, along with representation metadata describing
   those octets, that constitutes a record of the state of the resource
   at the time when the representation is generated.  Retrieval is
   achieved by a process that might include using the URI as a cache key
   to check for a locally cached representation, resolution of the URI
   to determine an appropriate access mechanism (if any), and
   dereference of the URI for the sake of applying a retrieval
   operation.  Depending on the protocols used to perform the retrieval,
   additional information might be supplied about the resource (resource
   metadata) and its relation to other resources.

   URI references in information retrieval systems are designed to be
   late-binding: the result of an access is generally determined when it
   is accessed and may vary over time or due to other aspects of the
   interaction.  These references are created in order to be used in the
   future: what is being identified is not some specific result that was
   obtained in the past, but rather some characteristic that is expected
   to be true for future results.  In such cases, the resource referred
   to by the URI is actually a sameness of characteristics as observed



Berners-Lee, et al.         Standards Track                     [Page 9]

RFC 3986                   URI Generic Syntax               January 2005


   over time, perhaps elucidated by additional comments or assertions
   made by the resource provider.

   Although many URI schemes are named after protocols, this does not
   imply that use of these URIs will result in access to the resource
   via the named protocol.  URIs are often used simply for the sake of
   identification.  Even when a URI is used to retrieve a representation
   of a resource, that access might be through gateways, proxies,
   caches, and name resolution services that are independent of the
   protocol associated with the scheme name.  The resolution of some
   URIs may require the use of more than one protocol (e.g., both DNS
   and HTTP are typically used to access an "http" URI's origin server
   when a representation isn't found in a local cache).

1.2.3.  Hierarchical Identifiers

   The URI syntax is organized hierarchically, with components listed in
   order of decreasing significance from left to right.  For some URI
   schemes, the visible hierarchy is limited to the scheme itself:
   everything after the scheme component delimiter (":") is considered
   opaque to URI processing.  Other URI schemes make the hierarchy
   explicit and visible to generic parsing algorithms.

   The generic syntax uses the slash ("/"), question mark ("?"), and
   number sign ("#") characters to delimit components that are
   significant to the generic parser's hierarchical interpretation of an
   identifier.  In addition to aiding the readability of such
   identifiers through the consistent use of familiar syntax, this
   uniform representation of hierarchy across naming schemes allows
   scheme-independent references to be made relative to that hierarchy.

   It is often the case that a group or "tree" of documents has been
   constructed to serve a common purpose, wherein the vast majority of
   URI references in these documents point to resources within the tree
   rather than outside it.  Similarly, documents located at a particular
   site are much more likely to refer to other resources at that site
   than to resources at remote sites.  Relative referencing of URIs
   allows document trees to be partially independent of their location
   and access scheme.  For instance, it is possible for a single set of
   hypertext documents to be simultaneously accessible and traversable
   via each of the "file", "http", and "ftp" schemes if the documents
   refer to each other with relative references.  Furthermore, such
   document trees can be moved, as a whole, without changing any of the
   relative references.

   A relative reference (Section 4.2) refers to a resource by describing
   the difference within a hierarchical name space between the reference
   context and the target URI.  The reference resolution algorithm,



Berners-Lee, et al.         Standards Track                    [Page 10]

RFC 3986                   URI Generic Syntax               January 2005


   presented in Section 5, defines how such a reference is transformed
   to the target URI.  As relative references can only be used within
   the context of a hierarchical URI, designers of new URI schemes
   should use a syntax consistent with the generic syntax's hierarchical
   components unless there are compelling reasons to forbid relative
   referencing within that scheme.

      NOTE: Previous specifications used the terms "partial URI" and
      "relative URI" to denote a relative reference to a URI.  As some
      readers misunderstood those terms to mean that relative URIs are a
      subset of URIs rather than a method of referencing URIs, this
      specification simply refers to them as relative references.

   All URI references are parsed by generic syntax parsers when used.
   However, because hierarchical processing has no effect on an absolute
   URI used in a reference unless it contains one or more dot-segments
   (complete path segments of "." or "..", as described in Section 3.3),
   URI scheme specifications can define opaque identifiers by
   disallowing use of slash characters, question mark characters, and
   the URIs "scheme:." and "scheme:..".

1.3.  Syntax Notation

   This specification uses the Augmented Backus-Naur Form (ABNF)
   notation of [RFC2234], including the following core ABNF syntax rules
   defined by that specification: ALPHA (letters), CR (carriage return),
   DIGIT (decimal digits), DQUOTE (double quote), HEXDIG (hexadecimal
   digits), LF (line feed), and SP (space).  The complete URI syntax is
   collected in Appendix A.

2.  Characters

   The URI syntax provides a method of encoding data, presumably for the
   sake of identifying a resource, as a sequence of characters.  The URI
   characters are, in turn, frequently encoded as octets for transport
   or presentation.  This specification does not mandate any particular
   character encoding for mapping between URI characters and the octets
   used to store or transmit those characters.  When a URI appears in a
   protocol element, the character encoding is defined by that protocol;
   without such a definition, a URI is assumed to be in the same
   character encoding as the surrounding text.

   The ABNF notation defines its terminal values to be non-negative
   integers (codepoints) based on the US-ASCII coded character set
   [ASCII].  Because a URI is a sequence of characters, we must invert
   that relation in order to understand the URI syntax.  Therefore, the





Berners-Lee, et al.         Standards Track                    [Page 11]

RFC 3986                   URI Generic Syntax               January 2005


   integer values used by the ABNF must be mapped back to their
   corresponding characters via US-ASCII in order to complete the syntax
   rules.

   A URI is composed from a limited set of characters consisting of
   digits, letters, and a few graphic symbols.  A reserved subset of
   those characters may be used to delimit syntax components within a
   URI while the remaining characters, including both the unreserved set
   and those reserved characters not acting as delimiters, define each
   component's identifying data.

2.1.  Percent-Encoding

   A percent-encoding mechanism is used to represent a data octet in a
   component when that octet's corresponding character is outside the
   allowed set or is being used as a delimiter of, or within, the
   component.  A percent-encoded octet is encoded as a character
   triplet, consisting of the percent character "%" followed by the two
   hexadecimal digits representing that octet's numeric value.  For
   example, "%20" is the percent-encoding for the binary octet
   "00100000" (ABNF: %x20), which in US-ASCII corresponds to the space
   character (SP).  Section 2.4 describes when percent-encoding and
   decoding is applied.

      pct-encoded = "%" HEXDIG HEXDIG

   The uppercase hexadecimal digits 'A' through 'F' are equivalent to
   the lowercase digits 'a' through 'f', respectively.  If two URIs
   differ only in the case of hexadecimal digits used in percent-encoded
   octets, they are equivalent.  For consistency, URI producers and
   normalizers should use uppercase hexadecimal digits for all percent-
   encodings.

2.2.  Reserved Characters

   URIs include components and subcomponents that are delimited by
   characters in the "reserved" set.  These characters are called
   "reserved" because they may (or may not) be defined as delimiters by
   the generic syntax, by each scheme-specific syntax, or by the
   implementation-specific syntax of a URI's dereferencing algorithm.
   If data for a URI component would conflict with a reserved
   character's purpose as a delimiter, then the conflicting data must be
   percent-encoded before the URI is formed.








Berners-Lee, et al.         Standards Track                    [Page 12]

RFC 3986                   URI Generic Syntax               January 2005


      reserved    = gen-delims / sub-delims

      gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

      sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="

   The purpose of reserved characters is to provide a set of delimiting
   characters that are distinguishable from other data within a URI.
   URIs that differ in the replacement of a reserved character with its
   corresponding percent-encoded octet are not equivalent.  Percent-
   encoding a reserved character, or decoding a percent-encoded octet
   that corresponds to a reserved character, will change how the URI is
   interpreted by most applications.  Thus, characters in the reserved
   set are protected from normalization and are therefore safe to be
   used by scheme-specific and producer-specific algorithms for
   delimiting data subcomponents within a URI.

   A subset of the reserved characters (gen-delims) is used as
   delimiters of the generic URI components described in Section 3.  A
   component's ABNF syntax rule will not use the reserved or gen-delims
   rule names directly; instead, each syntax rule lists the characters
   allowed within that component (i.e., not delimiting it), and any of
   those characters that are also in the reserved set are "reserved" for
   use as subcomponent delimiters within the component.  Only the most
   common subcomponents are defined by this specification; other
   subcomponents may be defined by a URI scheme's specification, or by
   the implementation-specific syntax of a URI's dereferencing
   algorithm, provided that such subcomponents are delimited by
   characters in the reserved set allowed within that component.

   URI producing applications should percent-encode data octets that
   correspond to characters in the reserved set unless these characters
   are specifically allowed by the URI scheme to represent data in that
   component.  If a reserved character is found in a URI component and
   no delimiting role is known for that character, then it must be
   interpreted as representing the data octet corresponding to that
   character's encoding in US-ASCII.

2.3.  Unreserved Characters

   Characters that are allowed in a URI but do not have a reserved
   purpose are called unreserved.  These include uppercase and lowercase
   letters, decimal digits, hyphen, period, underscore, and tilde.

      unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"





Berners-Lee, et al.         Standards Track                    [Page 13]

RFC 3986                   URI Generic Syntax               January 2005


   URIs that differ in the replacement of an unreserved character with
   its corresponding percent-encoded US-ASCII octet are equivalent: they
   identify the same resource.  However, URI comparison implementations
   do not always perform normalization prior to comparison (see Section
   6).  For consistency, percent-encoded octets in the ranges of ALPHA
   (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D), period (%2E),
   underscore (%5F), or tilde (%7E) should not be created by URI
   producers and, when found in a URI, should be decoded to their
   corresponding unreserved characters by URI normalizers.

2.4.  When to Encode or Decode

   Under normal circumstances, the only time when octets within a URI
   are percent-encoded is during the process of producing the URI from
   its component parts.  This is when an implementation determines which
   of the reserved characters are to be used as subcomponent delimiters
   and which can be safely used as data.  Once produced, a URI is always
   in its percent-encoded form.

   When a URI is dereferenced, the components and subcomponents
   significant to the scheme-specific dereferencing process (if any)
   must be parsed and separated before the percent-encoded octets within
   those components can be safely decoded, as otherwise the data may be
   mistaken for component delimiters.  The only exception is for
   percent-encoded octets corresponding to characters in the unreserved
   set, which can be decoded at any time.  For example, the octet
   corresponding to the tilde ("~") character is often encoded as "%7E"
   by older URI processing implementations; the "%7E" can be replaced by
   "~" without changing its interpretation.

   Because the percent ("%") character serves as the indicator for
   percent-encoded octets, it must be percent-encoded as "%25" for that
   octet to be used as data within a URI.  Implementations must not
   percent-encode or decode the same string more than once, as decoding
   an already decoded string might lead to misinterpreting a percent
   data octet as the beginning of a percent-encoding, or vice versa in
   the case of percent-encoding an already percent-encoded string.

2.5.  Identifying Data

   URI characters provide identifying data for each of the URI
   components, serving as an external interface for identification
   between systems.  Although the presence and nature of the URI
   production interface is hidden from clients that use its URIs (and is
   thus beyond the scope of the interoperability requirements defined by
   this specification), it is a frequent source of confusion and errors
   in the interpretation of URI character issues.  Implementers have to
   be aware that there are multiple character encodings involved in the



Berners-Lee, et al.         Standards Track                    [Page 14]

RFC 3986                   URI Generic Syntax               January 2005


   production and transmission of URIs: local name and data encoding,
   public interface encoding, URI character encoding, data format
   encoding, and protocol encoding.

   Local names, such as file system names, are stored with a local
   character encoding.  URI producing applications (e.g., origin
   servers) will typically use the local encoding as the basis for
   producing meaningful names.  The URI producer will transform the
   local encoding to one that is suitable for a public interface and
   then transform the public interface encoding into the restricted set
   of URI characters (reserved, unreserved, and percent-encodings).
   Those characters are, in turn, encoded as octets to be used as a
   reference within a data format (e.g., a document charset), and such
   data formats are often subsequently encoded for transmission over
   Internet protocols.

   For most systems, an unreserved character appearing within a URI
   component is interpreted as representing the data octet corresponding
   to that character's encoding in US-ASCII.  Consumers of URIs assume
   that the letter "X" corresponds to the octet "01011000", and even
   when that assumption is incorrect, there is no harm in making it.  A
   system that internally provides identifiers in the form of a
   different character encoding, such as EBCDIC, will generally perform
   character translation of textual identifiers to UTF-8 [STD63] (or
   some other superset of the US-ASCII character encoding) at an
   internal interface, thereby providing more meaningful identifiers
   than those resulting from simply percent-encoding the original
   octets.

   For example, consider an information service that provides data,
   stored locally using an EBCDIC-based file system, to clients on the
   Internet through an HTTP server.  When an author creates a file with
   the name "Laguna Beach" on that file system, the "http" URI
   corresponding to that resource is expected to contain the meaningful
   string "Laguna%20Beach".  If, however, that server produces URIs by
   using an overly simplistic raw octet mapping, then the result would
   be a URI containing "%D3%81%87%A4%95%81@%C2%85%81%83%88".  An
   internal transcoding interface fixes this problem by transcoding the
   local name to a superset of US-ASCII prior to producing the URI.
   Naturally, proper interpretation of an incoming URI on such an
   interface requires that percent-encoded octets be decoded (e.g.,
   "%20" to SP) before the reverse transcoding is applied to obtain the
   local name.

   In some cases, the internal interface between a URI component and the
   identifying data that it has been crafted to represent is much less
   direct than a character encoding translation.  For example, portions
   of a URI might reflect a query on non-ASCII data, or numeric



Berners-Lee, et al.         Standards Track                    [Page 15]

RFC 3986                   URI Generic Syntax               January 2005


   coordinates on a map.  Likewise, a URI scheme may define components
   with additional encoding requirements that are applied prior to
   forming the component and producing the URI.

   When a new URI scheme defines a component that represents textual
   data consisting of characters from the Universal Character Set [UCS],
   the data should first be encoded as octets according to the UTF-8
   character encoding [STD63]; then only those octets that do not
   correspond to characters in the unreserved set should be percent-
   encoded.  For example, the character A would be represented as "A",
   the character LATIN CAPITAL LETTER A WITH GRAVE would be represented
   as "%C3%80", and the character KATAKANA LETTER A would be represented
   as "%E3%82%A2".

3.  Syntax Components

   The generic URI syntax consists of a hierarchical sequence of
   components referred to as the scheme, authority, path, query, and
   fragment.

      URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

      hier-part   = "//" authority path-abempty
                  / path-absolute
                  / path-rootless
                  / path-empty

   The scheme and path components are required, though the path may be
   empty (no characters).  When authority is present, the path must
   either be empty or begin with a slash ("/") character.  When
   authority is not present, the path cannot begin with two slash
   characters ("//").  These restrictions result in five different ABNF
   rules for a path (Section 3.3), only one of which will match any
   given URI reference.

   The following are two example URIs and their component parts:

         foo://example.com:8042/over/there?name=ferret#nose
         \_/   \______________/\_________/ \_________/ \__/
          |           |            |            |        |
       scheme     authority       path        query   fragment
          |   _____________________|__
         / \ /                        \
         urn:example:animal:ferret:nose







Berners-Lee, et al.         Standards Track                    [Page 16]

RFC 3986                   URI Generic Syntax               January 2005


3.1.  Scheme

   Each URI begins with a scheme name that refers to a specification for
   assigning identifiers within that scheme.  As such, the URI syntax is
   a federated and extensible naming system wherein each scheme's
   specification may further restrict the syntax and semantics of
   identifiers using that scheme.

   Scheme names consist of a sequence of characters beginning with a
   letter and followed by any combination of letters, digits, plus
   ("+"), period ("."), or hyphen ("-").  Although schemes are case-
   insensitive, the canonical form is lowercase and documents that
   specify schemes must do so with lowercase letters.  An implementation
   should accept uppercase letters as equivalent to lowercase in scheme
   names (e.g., allow "HTTP" as well as "http") for the sake of
   robustness but should only produce lowercase scheme names for
   consistency.

      scheme      = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

   Individual schemes are not specified by this document.  The process
   for registration of new URI schemes is defined separately by [BCP35].
   The scheme registry maintains the mapping between scheme names and
   their specifications.  Advice for designers of new URI schemes can be
   found in [RFC2718].  URI scheme specifications must define their own
   syntax so that all strings matching their scheme-specific syntax will
   also match the <absolute-URI> grammar, as described in Section 4.3.

   When presented with a URI that violates one or more scheme-specific
   restrictions, the scheme-specific resolution process should flag the
   reference as an error rather than ignore the unused parts; doing so
   reduces the number of equivalent URIs and helps detect abuses of the
   generic syntax, which might indicate that the URI has been
   constructed to mislead the user (Section 7.6).

3.2.  Authority

   Many URI schemes include a hierarchical element for a naming
   authority so that governance of the name space defined by the
   remainder of the URI is delegated to that authority (which may, in
   turn, delegate it further).  The generic syntax provides a common
   means for distinguishing an authority based on a registered name or
   server address, along with optional port and user information.

   The authority component is preceded by a double slash ("//") and is
   terminated by the next slash ("/"), question mark ("?"), or number
   sign ("#") character, or by the end of the URI.




Berners-Lee, et al.         Standards Track                    [Page 17]

RFC 3986                   URI Generic Syntax               January 2005


      authority   = [ userinfo "@" ] host [ ":" port ]

   URI producers and normalizers should omit the ":" delimiter that
   separates host from port if the port component is empty.  Some
   schemes do not allow the userinfo and/or port subcomponents.

   If a URI contains an authority component, then the path component
   must either be empty or begin with a slash ("/") character.  Non-
   validating parsers (those that merely separate a URI reference into
   its major components) will often ignore the subcomponent structure of
   authority, treating it as an opaque string from the double-slash to
   the first terminating delimiter, until such time as the URI is
   dereferenced.

3.2.1.  User Information

   The userinfo subcomponent may consist of a user name and, optionally,
   scheme-specific information about how to gain authorization to access
   the resource.  The user information, if present, is followed by a
   commercial at-sign ("@") that delimits it from the host.

      userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )

   Use of the format "user:password" in the userinfo field is
   deprecated.  Applications should not render as clear text any data
   after the first colon (":") character found within a userinfo
   subcomponent unless the data after the colon is the empty string
   (indicating no password).  Applications may choose to ignore or
   reject such data when it is received as part of a reference and
   should reject the storage of such data in unencrypted form.  The
   passing of authentication information in clear text has proven to be
   a security risk in almost every case where it has been used.

   Applications that render a URI for the sake of user feedback, such as
   in graphical hypertext browsing, should render userinfo in a way that
   is distinguished from the rest of a URI, when feasible.  Such
   rendering will assist the user in cases where the userinfo has been
   misleadingly crafted to look like a trusted domain name
   (Section 7.6).

3.2.2.  Host

   The host subcomponent of authority is identified by an IP literal
   encapsulated within square brackets, an IPv4 address in dotted-
   decimal form, or a registered name.  The host subcomponent is case-
   insensitive.  The presence of a host subcomponent within a URI does
   not imply that the scheme requires access to the given host on the
   Internet.  In many cases, the host syntax is used only for the sake



Berners-Lee, et al.         Standards Track                    [Page 18]

RFC 3986                   URI Generic Syntax               January 2005


   of reusing the existing registration process created and deployed for
   DNS, thus obtaining a globally unique name without the cost of
   deploying another registry.  However, such use comes with its own
   costs: domain name ownership may change over time for reasons not
   anticipated by the URI producer.  In other cases, the data within the
   host component identifies a registered name that has nothing to do
   with an Internet host.  We use the name "host" for the ABNF rule
   because that is its most common purpose, not its only purpose.

      host        = IP-literal / IPv4address / reg-name

   The syntax rule for host is ambiguous because it does not completely
   distinguish between an IPv4address and a reg-name.  In order to
   disambiguate the syntax, we apply the "first-match-wins" algorithm:
   If host matches the rule for IPv4address, then it should be
   considered an IPv4 address literal and not a reg-name.  Although host
   is case-insensitive, producers and normalizers should use lowercase
   for registered names and hexadecimal addresses for the sake of
   uniformity, while only using uppercase letters for percent-encodings.

   A host identified by an Internet Protocol literal address, version 6
   [RFC3513] or later, is distinguished by enclosing the IP literal
   within square brackets ("[" and "]").  This is the only place where
   square bracket characters are allowed in the URI syntax.  In
   anticipation of future, as-yet-undefined IP literal address formats,
   an implementation may use an optional version flag to indicate such a
   format explicitly rather than rely on heuristic determination.

      IP-literal = "[" ( IPv6address / IPvFuture  ) "]"

      IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

   The version flag does not indicate the IP version; rather, it
   indicates future versions of the literal format.  As such,
   implementations must not provide the version flag for the existing
   IPv4 and IPv6 literal address forms described below.  If a URI
   containing an IP-literal that starts with "v" (case-insensitive),
   indicating that the version flag is present, is dereferenced by an
   application that does not know the meaning of that version flag, then
   the application should return an appropriate error for "address
   mechanism not supported".

   A host identified by an IPv6 literal address is represented inside
   the square brackets without a preceding version flag.  The ABNF
   provided here is a translation of the text definition of an IPv6
   literal address provided in [RFC3513].  This syntax does not support
   IPv6 scoped addressing zone identifiers.




Berners-Lee, et al.         Standards Track                    [Page 19]

RFC 3986                   URI Generic Syntax               January 2005


   A 128-bit IPv6 address is divided into eight 16-bit pieces.  Each
   piece is represented numerically in case-insensitive hexadecimal,
   using one to four hexadecimal digits (leading zeroes are permitted).
   The eight encoded pieces are given most-significant first, separated
   by colon characters.  Optionally, the least-significant two pieces
   may instead be represented in IPv4 address textual format.  A
   sequence of one or more consecutive zero-valued 16-bit pieces within
   the address may be elided, omitting all their digits and leaving
   exactly two consecutive colons in their place to mark the elision.

      IPv6address =                            6( h16 ":" ) ls32
                  /                       "::" 5( h16 ":" ) ls32
                  / [               h16 ] "::" 4( h16 ":" ) ls32
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
                  / [ *4( h16 ":" ) h16 ] "::"              ls32
                  / [ *5( h16 ":" ) h16 ] "::"              h16
                  / [ *6( h16 ":" ) h16 ] "::"

      ls32        = ( h16 ":" h16 ) / IPv4address
                  ; least-significant 32 bits of address

      h16         = 1*4HEXDIG
                  ; 16 bits of address represented in hexadecimal

   A host identified by an IPv4 literal address is represented in
   dotted-decimal notation (a sequence of four decimal numbers in the
   range 0 to 255, separated by "."), as described in [RFC1123] by
   reference to [RFC0952].  Note that other forms of dotted notation may
   be interpreted on some platforms, as described in Section 7.4, but
   only the dotted-decimal form of four octets is allowed by this
   grammar.

      IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

      dec-octet   = DIGIT                 ; 0-9
                  / %x31-39 DIGIT         ; 10-99
                  / "1" 2DIGIT            ; 100-199
                  / "2" %x30-34 DIGIT     ; 200-249
                  / "25" %x30-35          ; 250-255

   A host identified by a registered name is a sequence of characters
   usually intended for lookup within a locally defined host or service
   name registry, though the URI's scheme-specific semantics may require
   that a specific registry (or fixed name table) be used instead.  The
   most common name registry mechanism is the Domain Name System (DNS).
   A registered name intended for lookup in the DNS uses the syntax



Berners-Lee, et al.         Standards Track                    [Page 20]

RFC 3986                   URI Generic Syntax               January 2005


   defined in Section 3.5 of [RFC1034] and Section 2.1 of [RFC1123].
   Such a name consists of a sequence of domain labels separated by ".",
   each domain label starting and ending with an alphanumeric character
   and possibly also containing "-" characters.  The rightmost domain
   label of a fully qualified domain name in DNS may be followed by a
   single "." and should be if it is necessary to distinguish between
   the complete domain name and some local domain.

      reg-name    = *( unreserved / pct-encoded / sub-delims )

   If the URI scheme defines a default for host, then that default
   applies when the host subcomponent is undefined or when the
   registered name is empty (zero length).  For example, the "file" URI
   scheme is defined so that no authority, an empty host, and
   "localhost" all mean the end-user's machine, whereas the "http"
   scheme considers a missing authority or empty host invalid.

   This specification does not mandate a particular registered name
   lookup technology and therefore does not restrict the syntax of reg-
   name beyond what is necessary for interoperability.  Instead, it
   delegates the issue of registered name syntax conformance to the
   operating system of each application performing URI resolution, and
   that operating system decides what it will allow for the purpose of
   host identification.  A URI resolution implementation might use DNS,
   host tables, yellow pages, NetInfo, WINS, or any other system for
   lookup of registered names.  However, a globally scoped naming
   system, such as DNS fully qualified domain names, is necessary for
   URIs intended to have global scope.  URI producers should use names
   that conform to the DNS syntax, even when use of DNS is not
   immediately apparent, and should limit these names to no more than
   255 characters in length.

   The reg-name syntax allows percent-encoded octets in order to
   represent non-ASCII registered names in a uniform way that is
   independent of the underlying name resolution technology.  Non-ASCII
   characters must first be encoded according to UTF-8 [STD63], and then
   each octet of the corresponding UTF-8 sequence must be percent-
   encoded to be represented as URI characters.  URI producing
   applications must not use percent-encoding in host unless it is used
   to represent a UTF-8 character sequence.  When a non-ASCII registered
   name represents an internationalized domain name intended for
   resolution via the DNS, the name must be transformed to the IDNA
   encoding [RFC3490] prior to name lookup.  URI producers should
   provide these registered names in the IDNA encoding, rather than a
   percent-encoding, if they wish to maximize interoperability with
   legacy URI resolvers.





Berners-Lee, et al.         Standards Track                    [Page 21]

RFC 3986                   URI Generic Syntax               January 2005


3.2.3.  Port

   The port subcomponent of authority is designated by an optional port
   number in decimal following the host and delimited from it by a
   single colon (":") character.

      port        = *DIGIT

   A scheme may define a default port.  For example, the "http" scheme
   defines a default port of "80", corresponding to its reserved TCP
   port number.  The type of port designated by the port number (e.g.,
   TCP, UDP, SCTP) is defined by the URI scheme.  URI producers and
   normalizers should omit the port component and its ":" delimiter if
   port is empty or if its value would be the same as that of the
   scheme's default.

3.3.  Path

   The path component contains data, usually organized in hierarchical
   form, that, along with data in the non-hierarchical query component
   (Section 3.4), serves to identify a resource within the scope of the
   URI's scheme and naming authority (if any).  The path is terminated
   by the first question mark ("?") or number sign ("#") character, or
   by the end of the URI.

   If a URI contains an authority component, then the path component
   must either be empty or begin with a slash ("/") character.  If a URI
   does not contain an authority component, then the path cannot begin
   with two slash characters ("//").  In addition, a URI reference
   (Section 4.1) may be a relative-path reference, in which case the
   first path segment cannot contain a colon (":") character.  The ABNF
   requires five separate rules to disambiguate these cases, only one of
   which will match the path substring within a given URI reference.  We
   use the generic term "path component" to describe the URI substring
   matched by the parser to one of these rules.

      path          = path-abempty    ; begins with "/" or is empty
                    / path-absolute   ; begins with "/" but not "//"
                    / path-noscheme   ; begins with a non-colon segment
                    / path-rootless   ; begins with a segment
                    / path-empty      ; zero characters

      path-abempty  = *( "/" segment )
      path-absolute = "/" [ segment-nz *( "/" segment ) ]
      path-noscheme = segment-nz-nc *( "/" segment )
      path-rootless = segment-nz *( "/" segment )
      path-empty    = 0<pchar>




Berners-Lee, et al.         Standards Track                    [Page 22]

RFC 3986                   URI Generic Syntax               January 2005


      segment       = *pchar
      segment-nz    = 1*pchar
      segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                    ; non-zero-length segment without any colon ":"

      pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

   A path consists of a sequence of path segments separated by a slash
   ("/") character.  A path is always defined for a URI, though the
   defined path may be empty (zero length).  Use of the slash character
   to indicate hierarchy is only required when a URI will be used as the
   context for relative references.  For example, the URI
   <mailto:fred@example.com> has a path of "fred@example.com", whereas
   the URI <foo://info.example.com?fred> has an empty path.

   The path segments "." and "..", also known as dot-segments, are
   defined for relative reference within the path name hierarchy.  They
   are intended for use at the beginning of a relative-path reference
   (Section 4.2) to indicate relative position within the hierarchical
   tree of names.  This is similar to their role within some operating
   systems' file directory structures to indicate the current directory
   and parent directory, respectively.  However, unlike in a file
   system, these dot-segments are only interpreted within the URI path
   hierarchy and are removed as part of the resolution process (Section
   5.2).

   Aside from dot-segments in hierarchical paths, a path segment is
   considered opaque by the generic syntax.  URI producing applications
   often use the reserved characters allowed in a segment to delimit
   scheme-specific or dereference-handler-specific subcomponents.  For
   example, the semicolon (";") and equals ("=") reserved characters are
   often used to delimit parameters and parameter values applicable to
   that segment.  The comma (",") reserved character is often used for
   similar purposes.  For example, one URI producer might use a segment
   such as "name;v=1.1" to indicate a reference to version 1.1 of
   "name", whereas another might use a segment such as "name,1.1" to
   indicate the same.  Parameter types may be defined by scheme-specific
   semantics, but in most cases the syntax of a parameter is specific to
   the implementation of the URI's dereferencing algorithm.

3.4.  Query

   The query component contains non-hierarchical data that, along with
   data in the path component (Section 3.3), serves to identify a
   resource within the scope of the URI's scheme and naming authority
   (if any).  The query component is indicated by the first question
   mark ("?") character and terminated by a number sign ("#") character
   or by the end of the URI.



Berners-Lee, et al.         Standards Track                    [Page 23]

RFC 3986                   URI Generic Syntax               January 2005


      query       = *( pchar / "/" / "?" )

   The characters slash ("/") and question mark ("?") may represent data
   within the query component.  Beware that some older, erroneous
   implementations may not handle such data correctly when it is used as
   the base URI for relative references (Section 5.1), apparently
   because they fail to distinguish query data from path data when
   looking for hierarchical separators.  However, as query components
   are often used to carry identifying information in the form of
   "key=value" pairs and one frequently used value is a reference to
   another URI, it is sometimes better for usability to avoid percent-
   encoding those characters.

3.5.  Fragment

   The fragment identifier component of a URI allows indirect
   identification of a secondary resource by reference to a primary
   resource and additional identifying information.  The identified
   secondary resource may be some portion or subset of the primary
   resource, some view on representations of the primary resource, or
   some other resource defined or described by those representations.  A
   fragment identifier component is indicated by the presence of a
   number sign ("#") character and terminated by the end of the URI.

      fragment    = *( pchar / "/" / "?" )

   The semantics of a fragment identifier are defined by the set of
   representations that might result from a retrieval action on the
   primary resource.  The fragment's format and resolution is therefore
   dependent on the media type [RFC2046] of a potentially retrieved
   representation, even though such a retrieval is only performed if the
   URI is dereferenced.  If no such representation exists, then the
   semantics of the fragment are considered unknown and are effectively
   unconstrained.  Fragment identifier semantics are independent of the
   URI scheme and thus cannot be redefined by scheme specifications.

   Individual media types may define their own restrictions on or
   structures within the fragment identifier syntax for specifying
   different types of subsets, views, or external references that are
   identifiable as secondary resources by that media type.  If the
   primary resource has multiple representations, as is often the case
   for resources whose representation is selected based on attributes of
   the retrieval request (a.k.a., content negotiation), then whatever is
   identified by the fragment should be consistent across all of those
   representations.  Each representation should either define the
   fragment so that it corresponds to the same secondary resource,
   regardless of how it is represented, or should leave the fragment
   undefined (i.e., not found).



Berners-Lee, et al.         Standards Track                    [Page 24]

RFC 3986                   URI Generic Syntax               January 2005


   As with any URI, use of a fragment identifier component does not
   imply that a retrieval action will take place.  A URI with a fragment
   identifier may be used to refer to the secondary resource without any
   implication that the primary resource is accessible or will ever be
   accessed.

   Fragment identifiers have a special role in information retrieval
   systems as the primary form of client-side indirect referencing,
   allowing an author to specifically identify aspects of an existing
   resource that are only indirectly provided by the resource owner.  As
   such, the fragment identifier is not used in the scheme-specific
   processing of a URI; instead, the fragment identifier is separated
   from the rest of the URI prior to a dereference, and thus the
   identifying information within the fragment itself is dereferenced
   solely by the user agent, regardless of the URI scheme.  Although
   this separate handling is often perceived to be a loss of
   information, particularly for accurate redirection of references as
   resources move over time, it also serves to prevent information
   providers from denying reference authors the right to refer to
   information within a resource selectively.  Indirect referencing also
   provides additional flexibility and extensibility to systems that use
   URIs, as new media types are easier to define and deploy than new
   schemes of identification.

   The characters slash ("/") and question mark ("?") are allowed to
   represent data within the fragment identifier.  Beware that some
   older, erroneous implementations may not handle this data correctly
   when it is used as the base URI for relative references (Section
   5.1).

4.  Usage

   When applications make reference to a URI, they do not always use the
   full form of reference defined by the "URI" syntax rule.  To save
   space and take advantage of hierarchical locality, many Internet
   protocol elements and media type formats allow an abbreviation of a
   URI, whereas others restrict the syntax to a particular form of URI.
   We define the most common forms of reference syntax in this
   specification because they impact and depend upon the design of the
   generic syntax, requiring a uniform parsing algorithm in order to be
   interpreted consistently.

4.1.  URI Reference

   URI-reference is used to denote the most common usage of a resource
   identifier.

      URI-reference = URI / relative-ref



Berners-Lee, et al.         Standards Track                    [Page 25]

RFC 3986                   URI Generic Syntax               January 2005


   A URI-reference is either a URI or a relative reference.  If the
   URI-reference's prefix does not match the syntax of a scheme followed
   by its colon separator, then the URI-reference is a relative
   reference.

   A URI-reference is typically parsed first into the five URI
   components, in order to determine what components are present and
   whether the reference is relative.  Then, each component is parsed
   for its subparts and their validation.  The ABNF of URI-reference,
   along with the "first-match-wins" disambiguation rule, is sufficient
   to define a validating parser for the generic syntax.  Readers
   familiar with regular expressions should see Appendix B for an
   example of a non-validating URI-reference parser that will take any
   given string and extract the URI components.

4.2.  Relative Reference

   A relative reference takes advantage of the hierarchical syntax
   (Section 1.2.3) to express a URI reference relative to the name space
   of another hierarchical URI.

      relative-ref  = relative-part [ "?" query ] [ "#" fragment ]

      relative-part = "//" authority path-abempty
                    / path-absolute
                    / path-noscheme
                    / path-empty

   The URI referred to by a relative reference, also known as the target
   URI, is obtained by applying the reference resolution algorithm of
   Section 5.

   A relative reference that begins with two slash characters is termed
   a network-path reference; such references are rarely used.  A
   relative reference that begins with a single slash character is
   termed an absolute-path reference.  A relative reference that does
   not begin with a slash character is termed a relative-path reference.

   A path segment that contains a colon character (e.g., "this:that")
   cannot be used as the first segment of a relative-path reference, as
   it would be mistaken for a scheme name.  Such a segment must be
   preceded by a dot-segment (e.g., "./this:that") to make a relative-
   path reference.








Berners-Lee, et al.         Standards Track                    [Page 26]

RFC 3986                   URI Generic Syntax               January 2005


4.3.  Absolute URI

   Some protocol elements allow only the absolute form of a URI without
   a fragment identifier.  For example, defining a base URI for later
   use by relative references calls for an absolute-URI syntax rule that
   does not allow a fragment.

      absolute-URI  = scheme ":" hier-part [ "?" query ]

   URI scheme specifications must define their own syntax so that all
   strings matching their scheme-specific syntax will also match the
   <absolute-URI> grammar.  Scheme specifications will not define
   fragment identifier syntax or usage, regardless of its applicability
   to resources identifiable via that scheme, as fragment identification
   is orthogonal to scheme definition.  However, scheme specifications
   are encouraged to include a wide range of examples, including
   examples that show use of the scheme's URIs with fragment identifiers
   when such usage is appropriate.

4.4.  Same-Document Reference

   When a URI reference refers to a URI that is, aside from its fragment
   component (if any), identical to the base URI (Section 5.1), that
   reference is called a "same-document" reference.  The most frequent
   examples of same-document references are relative references that are
   empty or include only the number sign ("#") separator followed by a
   fragment identifier.

   When a same-document reference is dereferenced for a retrieval
   action, the target of that reference is defined to be within the same
   entity (representation, document, or message) as the reference;
   therefore, a dereference should not result in a new retrieval action.

   Normalization of the base and target URIs prior to their comparison,
   as described in Sections 6.2.2 and 6.2.3, is allowed but rarely
   performed in practice.  Normalization may increase the set of same-
   document references, which may be of benefit to some caching
   applications.  As such, reference authors should not assume that a
   slightly different, though equivalent, reference URI will (or will
   not) be interpreted as a same-document reference by any given
   application.

4.5.  Suffix Reference

   The URI syntax is designed for unambiguous reference to resources and
   extensibility via the URI scheme.  However, as URI identification and
   usage have become commonplace, traditional media (television, radio,
   newspapers, billboards, etc.) have increasingly used a suffix of the



Berners-Lee, et al.         Standards Track                    [Page 27]

RFC 3986                   URI Generic Syntax               January 2005


   URI as a reference, consisting of only the authority and path
   portions of the URI, such as

      www.w3.org/Addressing/

   or simply a DNS registered name on its own.  Such references are
   primarily intended for human interpretation rather than for machines,
   with the assumption that context-based heuristics are sufficient to
   complete the URI (e.g., most registered names beginning with "www"
   are likely to have a URI prefix of "http://").  Although there is no
   standard set of heuristics for disambiguating a URI suffix, many
   client implementations allow them to be entered by the user and
   heuristically resolved.

   Although this practice of using suffix references is common, it
   should be avoided whenever possible and should never be used in
   situations where long-term references are expected.  The heuristics
   noted above will change over time, particularly when a new URI scheme
   becomes popular, and are often incorrect when used out of context.
   Furthermore, they can lead to security issues along the lines of
   those described in [RFC1535].

   As a URI suffix has the same syntax as a relative-path reference, a
   suffix reference cannot be used in contexts where a relative
   reference is expected.  As a result, suffix references are limited to
   places where there is no defined base URI, such as dialog boxes and
   off-line advertisements.

5.  Reference Resolution

   This section defines the process of resolving a URI reference within
   a context that allows relative references so that the result is a
   string matching the <URI> syntax rule of Section 3.

5.1.  Establishing a Base URI

   The term "relative" implies that a "base URI" exists against which
   the relative reference is applied.  Aside from fragment-only
   references (Section 4.4), relative references are only usable when a
   base URI is known.  A base URI must be established by the parser
   prior to parsing URI references that might be relative.  A base URI
   must conform to the <absolute-URI> syntax rule (Section 4.3).  If the
   base URI is obtained from a URI reference, then that reference must
   be converted to absolute form and stripped of any fragment component
   prior to its use as a base URI.






Berners-Lee, et al.         Standards Track                    [Page 28]

RFC 3986                   URI Generic Syntax               January 2005


   The base URI of a reference can be established in one of four ways,
   discussed below in order of precedence.  The order of precedence can
   be thought of in terms of layers, where the innermost defined base
   URI has the highest precedence.  This can be visualized graphically
   as follows:

         .----------------------------------------------------------.
         |  .----------------------------------------------------.  |
         |  |  .----------------------------------------------.  |  |
         |  |  |  .----------------------------------------.  |  |  |
         |  |  |  |  .----------------------------------.  |  |  |  |
         |  |  |  |  |       <relative-reference>       |  |  |  |  |
         |  |  |  |  `----------------------------------'  |  |  |  |
         |  |  |  | (5.1.1) Base URI embedded in content   |  |  |  |
         |  |  |  `----------------------------------------'  |  |  |
         |  |  | (5.1.2) Base URI of the encapsulating entity |  |  |
         |  |  |         (message, representation, or none)   |  |  |
         |  |  `----------------------------------------------'  |  |
         |  | (5.1.3) URI used to retrieve the entity            |  |
         |  `----------------------------------------------------'  |
         | (5.1.4) Default Base URI (application-dependent)         |
         `----------------------------------------------------------'

5.1.1.  Base URI Embedded in Content

   Within certain media types, a base URI for relative references can be
   embedded within the content itself so that it can be readily obtained
   by a parser.  This can be useful for descriptive documents, such as
   tables of contents, which may be transmitted to others through
   protocols other than their usual retrieval context (e.g., email or
   USENET news).

   It is beyond the scope of this specification to specify how, for each
   media type, a base URI can be embedded.  The appropriate syntax, when
   available, is described by the data format specification associated
   with each media type.

5.1.2.  Base URI from the Encapsulating Entity

   If no base URI is embedded, the base URI is defined by the
   representation's retrieval context.  For a document that is enclosed
   within another entity, such as a message or archive, the retrieval
   context is that entity.  Thus, the default base URI of a
   representation is the base URI of the entity in which the
   representation is encapsulated.






Berners-Lee, et al.         Standards Track                    [Page 29]

RFC 3986                   URI Generic Syntax               January 2005


   A mechanism for embedding a base URI within MIME container types
   (e.g., the message and multipart types) is defined by MHTML
   [RFC2557].  Protocols that do not use the MIME message header syntax,
   but that do allow some form of tagged metadata to be included within
   messages, may define their own syntax for defining a base URI as part
   of a message.

5.1.3.  Base URI from the Retrieval URI

   If no base URI is embedded and the representation is not encapsulated
   within some other entity, then, if a URI was used to retrieve the
   representation, that URI shall be considered the base URI.  Note that
   if the retrieval was the result of a redirected request, the last URI
   used (i.e., the URI that resulted in the actual retrieval of the
   representation) is the base URI.

5.1.4.  Default Base URI

   If none of the conditions described above apply, then the base URI is
   defined by the context of the application.  As this definition is
   necessarily application-dependent, failing to define a base URI by
   using one of the other methods may result in the same content being
   interpreted differently by different types of applications.

   A sender of a representation containing relative references is
   responsible for ensuring that a base URI for those references can be
   established.  Aside from fragment-only references, relative
   references can only be used reliably in situations where the base URI
   is well defined.

5.2.  Relative Resolution

   This section describes an algorithm for converting a URI reference
   that might be relative to a given base URI into the parsed components
   of the reference's target.  The components can then be recomposed, as
   described in Section 5.3, to form the target URI.  This algorithm
   provides definitive results that can be used to test the output of
   other implementations.  Applications may implement relative reference
   resolution by using some other algorithm, provided that the results
   match what would be given by this one.











Berners-Lee, et al.         Standards Track                    [Page 30]

RFC 3986                   URI Generic Syntax               January 2005


5.2.1.  Pre-parse the Base URI

   The base URI (Base) is established according to the procedure of
   Section 5.1 and parsed into the five main components described in
   Section 3.  Note that only the scheme component is required to be
   present in a base URI; the other components may be empty or
   undefined.  A component is undefined if its associated delimiter does
   not appear in the URI reference; the path component is never
   undefined, though it may be empty.

   Normalization of the base URI, as described in Sections 6.2.2 and
   6.2.3, is optional.  A URI reference must be transformed to its
   target URI before it can be normalized.

5.2.2.  Transform References

   For each URI reference (R), the following pseudocode describes an
   algorithm for transforming R into its target URI (T):

      -- The URI reference is parsed into the five URI components
      --
      (R.scheme, R.authority, R.path, R.query, R.fragment) = parse(R);

      -- A non-strict parser may ignore a scheme in the reference
      -- if it is identical to the base URI's scheme.
      --
      if ((not strict) and (R.scheme == Base.scheme)) then
         undefine(R.scheme);
      endif;






















Berners-Lee, et al.         Standards Track                    [Page 31]

RFC 3986                   URI Generic Syntax               January 2005


      if defined(R.scheme) then
         T.scheme    = R.scheme;
         T.authority = R.authority;
         T.path      = remove_dot_segments(R.path);
         T.query     = R.query;
      else
         if defined(R.authority) then
            T.authority = R.authority;
            T.path      = remove_dot_segments(R.path);
            T.query     = R.query;
         else
            if (R.path == "") then
               T.path = Base.path;
               if defined(R.query) then
                  T.query = R.query;
               else
                  T.query = Base.query;
               endif;
            else
               if (R.path starts-with "/") then
                  T.path = remove_dot_segments(R.path);
               else
                  T.path = merge(Base.path, R.path);
                  T.path = remove_dot_segments(T.path);
               endif;
               T.query = R.query;
            endif;
            T.authority = Base.authority;
         endif;
         T.scheme = Base.scheme;
      endif;

      T.fragment = R.fragment;

5.2.3.  Merge Paths

   The pseudocode above refers to a "merge" routine for merging a
   relative-path reference with the path of the base URI.  This is
   accomplished as follows:

   o  If the base URI has a defined authority component and an empty
      path, then return a string consisting of "/" concatenated with the
      reference's path; otherwise,








Berners-Lee, et al.         Standards Track                    [Page 32]

RFC 3986                   URI Generic Syntax               January 2005


   o  return a string consisting of the reference's path component
      appended to all but the last segment of the base URI's path (i.e.,
      excluding any characters after the right-most "/" in the base URI
      path, or excluding the entire base URI path if it does not contain
      any "/" characters).

5.2.4.  Remove Dot Segments

   The pseudocode also refers to a "remove_dot_segments" routine for
   interpreting and removing the special "." and ".." complete path
   segments from a referenced path.  This is done after the path is
   extracted from a reference, whether or not the path was relative, in
   order to remove any invalid or extraneous dot-segments prior to
   forming the target URI.  Although there are many ways to accomplish
   this removal process, we describe a simple method using two string
   buffers.

   1.  The input buffer is initialized with the now-appended path
       components and the output buffer is initialized to the empty
       string.

   2.  While the input buffer is not empty, loop as follows:

       A.  If the input buffer begins with a prefix of "../" or "./",
           then remove that prefix from the input buffer; otherwise,

       B.  if the input buffer begins with a prefix of "/./" or "/.",
           where "." is a complete path segment, then replace that
           prefix with "/" in the input buffer; otherwise,

       C.  if the input buffer begins with a prefix of "/../" or "/..",
           where ".." is a complete path segment, then replace that
           prefix with "/" in the input buffer and remove the last
           segment and its preceding "/" (if any) from the output
           buffer; otherwise,

       D.  if the input buffer consists only of "." or "..", then remove
           that from the input buffer; otherwise,

       E.  move the first path segment in the input buffer to the end of
           the output buffer, including the initial "/" character (if
           any) and any subsequent characters up to, but not including,
           the next "/" character or the end of the input buffer.

   3.  Finally, the output buffer is returned as the result of
       remove_dot_segments.





Berners-Lee, et al.         Standards Track                    [Page 33]

RFC 3986                   URI Generic Syntax               January 2005


   Note that dot-segments are intended for use in URI references to
   express an identifier relative to the hierarchy of names in the base
   URI.  The remove_dot_segments algorithm respects that hierarchy by
   removing extra dot-segments rather than treat them as an error or
   leaving them to be misinterpreted by dereference implementations.

   The following illustrates how the above steps are applied for two
   examples of merged paths, showing the state of the two buffers after
   each step.

      STEP   OUTPUT BUFFER         INPUT BUFFER

       1 :                         /a/b/c/./../../g
       2E:   /a                    /b/c/./../../g
       2E:   /a/b                  /c/./../../g
       2E:   /a/b/c                /./../../g
       2B:   /a/b/c                /../../g
       2C:   /a/b                  /../g
       2C:   /a                    /g
       2E:   /a/g

      STEP   OUTPUT BUFFER         INPUT BUFFER

       1 :                         mid/content=5/../6
       2E:   mid                   /content=5/../6
       2E:   mid/content=5         /../6
       2C:   mid                   /6
       2E:   mid/6

   Some applications may find it more efficient to implement the
   remove_dot_segments algorithm by using two segment stacks rather than
   strings.

      Note: Beware that some older, erroneous implementations will fail
      to separate a reference's query component from its path component
      prior to merging the base and reference paths, resulting in an
      interoperability failure if the query component contains the
      strings "/../" or "/./".













Berners-Lee, et al.         Standards Track                    [Page 34]

RFC 3986                   URI Generic Syntax               January 2005


5.3.  Component Recomposition

   Parsed URI components can be recomposed to obtain the corresponding
   URI reference string.  Using pseudocode, this would be:

      result = ""

      if defined(scheme) then
         append scheme to result;
         append ":" to result;
      endif;

      if defined(authority) then
         append "//" to result;
         append authority to result;
      endif;

      append path to result;

      if defined(query) then
         append "?" to result;
         append query to result;
      endif;

      if defined(fragment) then
         append "#" to result;
         append fragment to result;
      endif;

      return result;

   Note that we are careful to preserve the distinction between a
   component that is undefined, meaning that its separator was not
   present in the reference, and a component that is empty, meaning that
   the separator was present and was immediately followed by the next
   component separator or the end of the reference.

5.4.  Reference Resolution Examples

   Within a representation with a well defined base URI of

      http://a/b/c/d;p?q

   a relative reference is transformed to its target URI as follows.







Berners-Lee, et al.         Standards Track                    [Page 35]

RFC 3986                   URI Generic Syntax               January 2005


5.4.1.  Normal Examples

      "g:h"           =  "g:h"
      "g"             =  "http://a/b/c/g"
      "./g"           =  "http://a/b/c/g"
      "g/"            =  "http://a/b/c/g/"
      "/g"            =  "http://a/g"
      "//g"           =  "http://g"
      "?y"            =  "http://a/b/c/d;p?y"
      "g?y"           =  "http://a/b/c/g?y"
      "#s"            =  "http://a/b/c/d;p?q#s"
      "g#s"           =  "http://a/b/c/g#s"
      "g?y#s"         =  "http://a/b/c/g?y#s"
      ";x"            =  "http://a/b/c/;x"
      "g;x"           =  "http://a/b/c/g;x"
      "g;x?y#s"       =  "http://a/b/c/g;x?y#s"
      ""              =  "http://a/b/c/d;p?q"
      "."             =  "http://a/b/c/"
      "./"            =  "http://a/b/c/"
      ".."            =  "http://a/b/"
      "../"           =  "http://a/b/"
      "../g"          =  "http://a/b/g"
      "../.."         =  "http://a/"
      "../../"        =  "http://a/"
      "../../g"       =  "http://a/g"

5.4.2.  Abnormal Examples

   Although the following abnormal examples are unlikely to occur in
   normal practice, all URI parsers should be capable of resolving them
   consistently.  Each example uses the same base as that above.

   Parsers must be careful in handling cases where there are more ".."
   segments in a relative-path reference than there are hierarchical
   levels in the base URI's path.  Note that the ".." syntax cannot be
   used to change the authority component of a URI.

      "../../../g"    =  "http://a/g"
      "../../../../g" =  "http://a/g"












Berners-Lee, et al.         Standards Track                    [Page 36]

RFC 3986                   URI Generic Syntax               January 2005


   Similarly, parsers must remove the dot-segments "." and ".." when
   they are complete components of a path, but not when they are only
   part of a segment.

      "/./g"          =  "http://a/g"
      "/../g"         =  "http://a/g"
      "g."            =  "http://a/b/c/g."
      ".g"            =  "http://a/b/c/.g"
      "g.."           =  "http://a/b/c/g.."
      "..g"           =  "http://a/b/c/..g"

   Less likely are cases where the relative reference uses unnecessary
   or nonsensical forms of the "." and ".." complete path segments.

      "./../g"        =  "http://a/b/g"
      "./g/."         =  "http://a/b/c/g/"
      "g/./h"         =  "http://a/b/c/g/h"
      "g/../h"        =  "http://a/b/c/h"
      "g;x=1/./y"     =  "http://a/b/c/g;x=1/y"
      "g;x=1/../y"    =  "http://a/b/c/y"

   Some applications fail to separate the reference's query and/or
   fragment components from the path component before merging it with
   the base path and removing dot-segments.  This error is rarely
   noticed, as typical usage of a fragment never includes the hierarchy
   ("/") character and the query component is not normally used within
   relative references.

      "g?y/./x"       =  "http://a/b/c/g?y/./x"
      "g?y/../x"      =  "http://a/b/c/g?y/../x"
      "g#s/./x"       =  "http://a/b/c/g#s/./x"
      "g#s/../x"      =  "http://a/b/c/g#s/../x"

   Some parsers allow the scheme name to be present in a relative
   reference if it is the same as the base URI scheme.  This is
   considered to be a loophole in prior specifications of partial URI
   [RFC1630].  Its use should be avoided but is allowed for backward
   compatibility.

      "http:g"        =  "http:g"         ; for strict parsers
                      /  "http://a/b/c/g" ; for backward compatibility










Berners-Lee, et al.         Standards Track                    [Page 37]

RFC 3986                   URI Generic Syntax               January 2005


6.  Normalization and Comparison

   One of the most common operations on URIs is simple comparison:
   determining whether two URIs are equivalent without using the URIs to
   access their respective resource(s).  A comparison is performed every
   time a response cache is accessed, a browser checks its history to
   color a link, or an XML parser processes tags within a namespace.
   Extensive normalization prior to comparison of URIs is often used by
   spiders and indexing engines to prune a search space or to reduce
   duplication of request actions and response storage.

   URI comparison is performed for some particular purpose.  Protocols
   or implementations that compare URIs for different purposes will
   often be subject to differing design trade-offs in regards to how
   much effort should be spent in reducing aliased identifiers.  This
   section describes various methods that may be used to compare URIs,
   the trade-offs between them, and the types of applications that might
   use them.

6.1.  Equivalence

   Because URIs exist to identify resources, presumably they should be
   considered equivalent when they identify the same resource.  However,
   this definition of equivalence is not of much practical use, as there
   is no way for an implementation to compare two resources unless it
   has full knowledge or control of them.  For this reason,
   determination of equivalence or difference of URIs is based on string
   comparison, perhaps augmented by reference to additional rules
   provided by URI scheme definitions.  We use the terms "different" and
   "equivalent" to describe the possible outcomes of such comparisons,
   but there are many application-dependent versions of equivalence.

   Even though it is possible to determine that two URIs are equivalent,
   URI comparison is not sufficient to determine whether two URIs
   identify different resources.  For example, an owner of two different
   domain names could decide to serve the same resource from both,
   resulting in two different URIs.  Therefore, comparison methods are
   designed to minimize false negatives while strictly avoiding false
   positives.

   In testing for equivalence, applications should not directly compare
   relative references; the references should be converted to their
   respective target URIs before comparison.  When URIs are compared to
   select (or avoid) a network action, such as retrieval of a
   representation, fragment components (if any) should be excluded from
   the comparison.





Berners-Lee, et al.         Standards Track                    [Page 38]

RFC 3986                   URI Generic Syntax               January 2005


6.2.  Comparison Ladder

   A variety of methods are used in practice to test URI equivalence.
   These methods fall into a range, distinguished by the amount of
   processing required and the degree to which the probability of false
   negatives is reduced.  As noted above, false negatives cannot be
   eliminated.  In practice, their probability can be reduced, but this
   reduction requires more processing and is not cost-effective for all
   applications.

   If this range of comparison practices is considered as a ladder, the
   following discussion will climb the ladder, starting with practices
   that are cheap but have a relatively higher chance of producing false
   negatives, and proceeding to those that have higher computational
   cost and lower risk of false negatives.

6.2.1.  Simple String Comparison

   If two URIs, when considered as character strings, are identical,
   then it is safe to conclude that they are equivalent.  This type of
   equivalence test has very low computational cost and is in wide use
   in a variety of applications, particularly in the domain of parsing.

   Testing strings for equivalence requires some basic precautions.
   This procedure is often referred to as "bit-for-bit" or
   "byte-for-byte" comparison, which is potentially misleading.  Testing
   strings for equality is normally based on pair comparison of the
   characters that make up the strings, starting from the first and
   proceeding until both strings are exhausted and all characters are
   found to be equal, until a pair of characters compares unequal, or
   until one of the strings is exhausted before the other.

   This character comparison requires that each pair of characters be
   put in comparable form.  For example, should one URI be stored in a
   byte array in EBCDIC encoding and the second in a Java String object
   (UTF-16), bit-for-bit comparisons applied naively will produce
   errors.  It is better to speak of equality on a character-for-
   character basis rather than on a byte-for-byte or bit-for-bit basis.
   In practical terms, character-by-character comparisons should be done
   codepoint-by-codepoint after conversion to a common character
   encoding.

   False negatives are caused by the production and use of URI aliases.
   Unnecessary aliases can be reduced, regardless of the comparison
   method, by consistently providing URI references in an already-
   normalized form (i.e., a form identical to what would be produced
   after normalization is applied, as described below).




Berners-Lee, et al.         Standards Track                    [Page 39]

RFC 3986                   URI Generic Syntax               January 2005


   Protocols and data formats often limit some URI comparisons to simple
   string comparison, based on the theory that people and
   implementations will, in their own best interest, be consistent in
   providing URI references, or at least consistent enough to negate any
   efficiency that might be obtained from further normalization.

6.2.2.  Syntax-Based Normalization

   Implementations may use logic based on the definitions provided by
   this specification to reduce the probability of false negatives.
   This processing is moderately higher in cost than character-for-
   character string comparison.  For example, an application using this
   approach could reasonably consider the following two URIs equivalent:

      example://a/b/c/%7Bfoo%7D
      eXAMPLE://a/./b/../b/%63/%7bfoo%7d

   Web user agents, such as browsers, typically apply this type of URI
   normalization when determining whether a cached response is
   available.  Syntax-based normalization includes such techniques as
   case normalization, percent-encoding normalization, and removal of
   dot-segments.

6.2.2.1.  Case Normalization

   For all URIs, the hexadecimal digits within a percent-encoding
   triplet (e.g., "%3a" versus "%3A") are case-insensitive and therefore
   should be normalized to use uppercase letters for the digits A-F.

   When a URI uses components of the generic syntax, the component
   syntax equivalence rules always apply; namely, that the scheme and
   host are case-insensitive and therefore should be normalized to
   lowercase.  For example, the URI <HTTP://www.EXAMPLE.com/> is
   equivalent to <http://www.example.com/>.  The other generic syntax
   components are assumed to be case-sensitive unless specifically
   defined otherwise by the scheme (see Section 6.2.3).

6.2.2.2.  Percent-Encoding Normalization

   The percent-encoding mechanism (Section 2.1) is a frequent source of
   variance among otherwise identical URIs.  In addition to the case
   normalization issue noted above, some URI producers percent-encode
   octets that do not require percent-encoding, resulting in URIs that
   are equivalent to their non-encoded counterparts.  These URIs should
   be normalized by decoding any percent-encoded octet that corresponds
   to an unreserved character, as described in Section 2.3.





Berners-Lee, et al.         Standards Track                    [Page 40]

RFC 3986                   URI Generic Syntax               January 2005


6.2.2.3.  Path Segment Normalization

   The complete path segments "." and ".." are intended only for use
   within relative references (Section 4.1) and are removed as part of
   the reference resolution process (Section 5.2).  However, some
   deployed implementations incorrectly assume that reference resolution
   is not necessary when the reference is already a URI and thus fail to
   remove dot-segments when they occur in non-relative paths.  URI
   normalizers should remove dot-segments by applying the
   remove_dot_segments algorithm to the path, as described in
   Section 5.2.4.

6.2.3.  Scheme-Based Normalization

   The syntax and semantics of URIs vary from scheme to scheme, as
   described by the defining specification for each scheme.
   Implementations may use scheme-specific rules, at further processing
   cost, to reduce the probability of false negatives.  For example,
   because the "http" scheme makes use of an authority component, has a
   default port of "80", and defines an empty path to be equivalent to
   "/", the following four URIs are equivalent:

      http://example.com
      http://example.com/
      http://example.com:/
      http://example.com:80/

   In general, a URI that uses the generic syntax for authority with an
   empty path should be normalized to a path of "/".  Likewise, an
   explicit ":port", for which the port is empty or the default for the
   scheme, is equivalent to one where the port and its ":" delimiter are
   elided and thus should be removed by scheme-based normalization.  For
   example, the second URI above is the normal form for the "http"
   scheme.

   Another case where normalization varies by scheme is in the handling
   of an empty authority component or empty host subcomponent.  For many
   scheme specifications, an empty authority or host is considered an
   error; for others, it is considered equivalent to "localhost" or the
   end-user's host.  When a scheme defines a default for authority and a
   URI reference to that default is desired, the reference should be
   normalized to an empty authority for the sake of uniformity, brevity,
   and internationalization.  If, however, either the userinfo or port
   subcomponents are non-empty, then the host should be given explicitly
   even if it matches the default.

   Normalization should not remove delimiters when their associated
   component is empty unless licensed to do so by the scheme



Berners-Lee, et al.         Standards Track                    [Page 41]

RFC 3986                   URI Generic Syntax               January 2005


   specification.  For example, the URI "http://example.com/?" cannot be
   assumed to be equivalent to any of the examples above.  Likewise, the
   presence or absence of delimiters within a userinfo subcomponent is
   usually significant to its interpretation.  The fragment component is
   not subject to any scheme-based normalization; thus, two URIs that
   differ only by the suffix "#" are considered different regardless of
   the scheme.

   Some schemes define additional subcomponents that consist of case-
   insensitive data, giving an implicit license to normalizers to
   convert this data to a common case (e.g., all lowercase).  For
   example, URI schemes that define a subcomponent of path to contain an
   Internet hostname, such as the "mailto" URI scheme, cause that
   subcomponent to be case-insensitive and thus subject to case
   normalization (e.g., "mailto:Joe@Example.COM" is equivalent to
   "mailto:Joe@example.com", even though the generic syntax considers
   the path component to be case-sensitive).

   Other scheme-specific normalizations are possible.

6.2.4.  Protocol-Based Normalization

   Substantial effort to reduce the incidence of false negatives is
   often cost-effective for web spiders.  Therefore, they implement even
   more aggressive techniques in URI comparison.  For example, if they
   observe that a URI such as

      http://example.com/data

   redirects to a URI differing only in the trailing slash

      http://example.com/data/

   they will likely regard the two as equivalent in the future.  This
   kind of technique is only appropriate when equivalence is clearly
   indicated by both the result of accessing the resources and the
   common conventions of their scheme's dereference algorithm (in this
   case, use of redirection by HTTP origin servers to avoid problems
   with relative references).












Berners-Lee, et al.         Standards Track                    [Page 42]

RFC 3986                   URI Generic Syntax               January 2005


7.  Security Considerations

   A URI does not in itself pose a security threat.  However, as URIs
   are often used to provide a compact set of instructions for access to
   network resources, care must be taken to properly interpret the data
   within a URI, to prevent that data from causing unintended access,
   and to avoid including data that should not be revealed in plain
   text.

7.1.  Reliability and Consistency

   There is no guarantee that once a URI has been used to retrieve
   information, the same information will be retrievable by that URI in
   the future.  Nor is there any guarantee that the information
   retrievable via that URI in the future will be observably similar to
   that retrieved in the past.  The URI syntax does not constrain how a
   given scheme or authority apportions its namespace or maintains it
   over time.  Such guarantees can only be obtained from the person(s)
   controlling that namespace and the resource in question.  A specific
   URI scheme may define additional semantics, such as name persistence,
   if those semantics are required of all naming authorities for that
   scheme.

7.2.  Malicious Construction

   It is sometimes possible to construct a URI so that an attempt to
   perform a seemingly harmless, idempotent operation, such as the
   retrieval of a representation, will in fact cause a possibly damaging
   remote operation.  The unsafe URI is typically constructed by
   specifying a port number other than that reserved for the network
   protocol in question.  The client unwittingly contacts a site running
   a different protocol service, and data within the URI contains
   instructions that, when interpreted according to this other protocol,
   cause an unexpected operation.  A frequent example of such abuse has
   been the use of a protocol-based scheme with a port component of
   "25", thereby fooling user agent software into sending an unintended
   or impersonating message via an SMTP server.

   Applications should prevent dereference of a URI that specifies a TCP
   port number within the "well-known port" range (0 - 1023) unless the
   protocol being used to dereference that URI is compatible with the
   protocol expected on that well-known port.  Although IANA maintains a
   registry of well-known ports, applications should make such
   restrictions user-configurable to avoid preventing the deployment of
   new services.






Berners-Lee, et al.         Standards Track                    [Page 43]

RFC 3986                   URI Generic Syntax               January 2005


   When a URI contains percent-encoded octets that match the delimiters
   for a given resolution or dereference protocol (for example, CR and
   LF characters for the TELNET protocol), these percent-encodings must
   not be decoded before transmission across that protocol.  Transfer of
   the percent-encoding, which might violate the protocol, is less
   harmful than allowing decoded octets to be interpreted as additional
   operations or parameters, perhaps triggering an unexpected and
   possibly harmful remote operation.

7.3.  Back-End Transcoding

   When a URI is dereferenced, the data within it is often parsed by
   both the user agent and one or more servers.  In HTTP, for example, a
   typical user agent will parse a URI into its five major components,
   access the authority's server, and send it the data within the
   authority, path, and query components.  A typical server will take
   that information, parse the path into segments and the query into
   key/value pairs, and then invoke implementation-specific handlers to
   respond to the request.  As a result, a common security concern for
   server implementations that handle a URI, either as a whole or split
   into separate components, is proper interpretation of the octet data
   represented by the characters and percent-encodings within that URI.

   Percent-encoded octets must be decoded at some point during the
   dereference process.  Applications must split the URI into its
   components and subcomponents prior to decoding the octets, as
   otherwise the decoded octets might be mistaken for delimiters.
   Security checks of the data within a URI should be applied after
   decoding the octets.  Note, however, that the "%00" percent-encoding
   (NUL) may require special handling and should be rejected if the
   application is not expecting to receive raw data within a component.

   Special care should be taken when the URI path interpretation process
   involves the use of a back-end file system or related system
   functions.  File systems typically assign an operational meaning to
   special characters, such as the "/", "\", ":", "[", and "]"
   characters, and to special device names like ".", "..", "...", "aux",
   "lpt", etc.  In some cases, merely testing for the existence of such
   a name will cause the operating system to pause or invoke unrelated
   system calls, leading to significant security concerns regarding
   denial of service and unintended data transfer.  It would be
   impossible for this specification to list all such significant
   characters and device names.  Implementers should research the
   reserved names and characters for the types of storage device that
   may be attached to their applications and restrict the use of data
   obtained from URI components accordingly.





Berners-Lee, et al.         Standards Track                    [Page 44]

RFC 3986                   URI Generic Syntax               January 2005


7.4.  Rare IP Address Formats

   Although the URI syntax for IPv4address only allows the common
   dotted-decimal form of IPv4 address literal, many implementations
   that process URIs make use of platform-dependent system routines,
   such as gethostbyname() and inet_aton(), to translate the string
   literal to an actual IP address.  Unfortunately, such system routines
   often allow and process a much larger set of formats than those
   described in Section 3.2.2.

   For example, many implementations allow dotted forms of three
   numbers, wherein the last part is interpreted as a 16-bit quantity
   and placed in the right-most two bytes of the network address (e.g.,
   a Class B network).  Likewise, a dotted form of two numbers means
   that the last part is interpreted as a 24-bit quantity and placed in
   the right-most three bytes of the network address (Class A), and a
   single number (without dots) is interpreted as a 32-bit quantity and
   stored directly in the network address.  Adding further to the
   confusion, some implementations allow each dotted part to be
   interpreted as decimal, octal, or hexadecimal, as specified in the C
   language (i.e., a leading 0x or 0X implies hexadecimal; a leading 0
   implies octal; otherwise, the number is interpreted as decimal).

   These additional IP address formats are not allowed in the URI syntax
   due to differences between platform implementations.  However, they
   can become a security concern if an application attempts to filter
   access to resources based on the IP address in string literal format.
   If this filtering is performed, literals should be converted to
   numeric form and filtered based on the numeric value, and not on a
   prefix or suffix of the string form.

7.5.  Sensitive Information

   URI producers should not provide a URI that contains a username or
   password that is intended to be secret.  URIs are frequently
   displayed by browsers, stored in clear text bookmarks, and logged by
   user agent history and intermediary applications (proxies).  A
   password appearing within the userinfo component is deprecated and
   should be considered an error (or simply ignored) except in those
   rare cases where the 'password' parameter is intended to be public.

7.6.  Semantic Attacks

   Because the userinfo subcomponent is rarely used and appears before
   the host in the authority component, it can be used to construct a
   URI intended to mislead a human user by appearing to identify one
   (trusted) naming authority while actually identifying a different
   authority hidden behind the noise.  For example



Berners-Lee, et al.         Standards Track                    [Page 45]

RFC 3986                   URI Generic Syntax               January 2005


      ftp://cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm

   might lead a human user to assume that the host is 'cnn.example.com',
   whereas it is actually '10.0.0.1'.  Note that a misleading userinfo
   subcomponent could be much longer than the example above.

   A misleading URI, such as that above, is an attack on the user's
   preconceived notions about the meaning of a URI rather than an attack
   on the software itself.  User agents may be able to reduce the impact
   of such attacks by distinguishing the various components of the URI
   when they are rendered, such as by using a different color or tone to
   render userinfo if any is present, though there is no panacea.  More
   information on URI-based semantic attacks can be found in [Siedzik].

8.  IANA Considerations

   URI scheme names, as defined by <scheme> in Section 3.1, form a
   registered namespace that is managed by IANA according to the
   procedures defined in [BCP35].  No IANA actions are required by this
   document.

9.  Acknowledgements

   This specification is derived from RFC 2396 [RFC2396], RFC 1808
   [RFC1808], and RFC 1738 [RFC1738]; the acknowledgements in those
   documents still apply.  It also incorporates the update (with
   corrections) for IPv6 literals in the host syntax, as defined by
   Robert M. Hinden, Brian E. Carpenter, and Larry Masinter in
   [RFC2732].  In addition, contributions by Gisle Aas, Reese Anschultz,
   Daniel Barclay, Tim Bray, Mike Brown, Rob Cameron, Jeremy Carroll,
   Dan Connolly, Adam M. Costello, John Cowan, Jason Diamond, Martin
   Duerst, Stefan Eissing, Clive D.W. Feather, Al Gilman, Tony Hammond,
   Elliotte Harold, Pat Hayes, Henry Holtzman, Ian B. Jacobs, Michael
   Kay, John C. Klensin, Graham Klyne, Dan Kohn, Bruce Lilly, Andrew
   Main, Dave McAlpin, Ira McDonald, Michael Mealling, Ray Merkert,
   Stephen Pollei, Julian Reschke, Tomas Rokicki, Miles Sabin, Kai
   Schaetzl, Mark Thomson, Ronald Tschalaer, Norm Walsh, Marc Warne,
   Stuart Williams, and Henry Zongaro are gratefully acknowledged.

10.  References

10.1.  Normative References

   [ASCII]    American National Standards Institute, "Coded Character
              Set -- 7-bit American Standard Code for Information
              Interchange", ANSI X3.4, 1986.





Berners-Lee, et al.         Standards Track                    [Page 46]

RFC 3986                   URI Generic Syntax               January 2005


   [RFC2234]  Crocker, D. and P. Overell, "Augmented BNF for Syntax
              Specifications: ABNF", RFC 2234, November 1997.

   [STD63]    Yergeau, F., "UTF-8, a transformation format of
              ISO 10646", STD 63, RFC 3629, November 2003.

   [UCS]      International Organization for Standardization,
              "Information Technology - Universal Multiple-Octet Coded
              Character Set (UCS)", ISO/IEC 10646:2003, December 2003.

10.2.  Informative References

   [BCP19]    Freed, N. and J. Postel, "IANA Charset Registration
              Procedures", BCP 19, RFC 2978, October 2000.

   [BCP35]    Petke, R. and I. King, "Registration Procedures for URL
              Scheme Names", BCP 35, RFC 2717, November 1999.

   [RFC0952]  Harrenstien, K., Stahl, M., and E. Feinler, "DoD Internet
              host table specification", RFC 952, October 1985.

   [RFC1034]  Mockapetris, P., "Domain names - concepts and facilities",
              STD 13, RFC 1034, November 1987.

   [RFC1123]  Braden, R., "Requirements for Internet Hosts - Application
              and Support", STD 3, RFC 1123, October 1989.

   [RFC1535]  Gavron, E., "A Security Problem and Proposed Correction
              With Widely Deployed DNS Software", RFC 1535,
              October 1993.

   [RFC1630]  Berners-Lee, T., "Universal Resource Identifiers in WWW: A
              Unifying Syntax for the Expression of Names and Addresses
              of Objects on the Network as used in the World-Wide Web",
              RFC 1630, June 1994.

   [RFC1736]  Kunze, J., "Functional Recommendations for Internet
              Resource Locators", RFC 1736, February 1995.

   [RFC1737]  Sollins, K. and L. Masinter, "Functional Requirements for
              Uniform Resource Names", RFC 1737, December 1994.

   [RFC1738]  Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
              Resource Locators (URL)", RFC 1738, December 1994.

   [RFC1808]  Fielding, R., "Relative Uniform Resource Locators",
              RFC 1808, June 1995.




Berners-Lee, et al.         Standards Track                    [Page 47]

RFC 3986                   URI Generic Syntax               January 2005


   [RFC2046]  Freed, N. and N. Borenstein, "Multipurpose Internet Mail
              Extensions (MIME) Part Two: Media Types", RFC 2046,
              November 1996.

   [RFC2141]  Moats, R., "URN Syntax", RFC 2141, May 1997.

   [RFC2396]  Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
              Resource Identifiers (URI): Generic Syntax", RFC 2396,
              August 1998.

   [RFC2518]  Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
              Jensen, "HTTP Extensions for Distributed Authoring --
              WEBDAV", RFC 2518, February 1999.

   [RFC2557]  Palme, J., Hopmann, A., and N. Shelness, "MIME
              Encapsulation of Aggregate Documents, such as HTML
              (MHTML)", RFC 2557, March 1999.

   [RFC2718]  Masinter, L., Alvestrand, H., Zigmond, D., and R. Petke,
              "Guidelines for new URL Schemes", RFC 2718, November 1999.

   [RFC2732]  Hinden, R., Carpenter, B., and L. Masinter, "Format for
              Literal IPv6 Addresses in URL's", RFC 2732, December 1999.

   [RFC3305]  Mealling, M. and R. Denenberg, "Report from the Joint
              W3C/IETF URI Planning Interest Group: Uniform Resource
              Identifiers (URIs), URLs, and Uniform Resource Names
              (URNs): Clarifications and Recommendations", RFC 3305,
              August 2002.

   [RFC3490]  Faltstrom, P., Hoffman, P., and A. Costello,
              "Internationalizing Domain Names in Applications (IDNA)",
              RFC 3490, March 2003.

   [RFC3513]  Hinden, R. and S. Deering, "Internet Protocol Version 6
              (IPv6) Addressing Architecture", RFC 3513, April 2003.

   [Siedzik]  Siedzik, R., "Semantic Attacks: What's in a URL?",
              April 2001, <http://www.giac.org/practical/gsec/
              Richard_Siedzik_GSEC.pdf>.











Berners-Lee, et al.         Standards Track                    [Page 48]

RFC 3986                   URI Generic Syntax               January 2005


Appendix A.  Collected ABNF for URI

   URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

   hier-part     = "//" authority path-abempty
                 / path-absolute
                 / path-rootless
                 / path-empty

   URI-reference = URI / relative-ref

   absolute-URI  = scheme ":" hier-part [ "?" query ]

   relative-ref  = relative-part [ "?" query ] [ "#" fragment ]

   relative-part = "//" authority path-abempty
                 / path-absolute
                 / path-noscheme
                 / path-empty

   scheme        = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

   authority     = [ userinfo "@" ] host [ ":" port ]
   userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
   host          = IP-literal / IPv4address / reg-name
   port          = *DIGIT

   IP-literal    = "[" ( IPv6address / IPvFuture  ) "]"

   IPvFuture     = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

   IPv6address   =                            6( h16 ":" ) ls32
                 /                       "::" 5( h16 ":" ) ls32
                 / [               h16 ] "::" 4( h16 ":" ) ls32
                 / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
                 / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
                 / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
                 / [ *4( h16 ":" ) h16 ] "::"              ls32
                 / [ *5( h16 ":" ) h16 ] "::"              h16
                 / [ *6( h16 ":" ) h16 ] "::"

   h16           = 1*4HEXDIG
   ls32          = ( h16 ":" h16 ) / IPv4address
   IPv4address   = dec-octet "." dec-octet "." dec-octet "." dec-octet







Berners-Lee, et al.         Standards Track                    [Page 49]

RFC 3986                   URI Generic Syntax               January 2005


   dec-octet     = DIGIT                 ; 0-9
                 / %x31-39 DIGIT         ; 10-99
                 / "1" 2DIGIT            ; 100-199
                 / "2" %x30-34 DIGIT     ; 200-249
                 / "25" %x30-35          ; 250-255

   reg-name      = *( unreserved / pct-encoded / sub-delims )

   path          = path-abempty    ; begins with "/" or is empty
                 / path-absolute   ; begins with "/" but not "//"
                 / path-noscheme   ; begins with a non-colon segment
                 / path-rootless   ; begins with a segment
                 / path-empty      ; zero characters

   path-abempty  = *( "/" segment )
   path-absolute = "/" [ segment-nz *( "/" segment ) ]
   path-noscheme = segment-nz-nc *( "/" segment )
   path-rootless = segment-nz *( "/" segment )
   path-empty    = 0<pchar>

   segment       = *pchar
   segment-nz    = 1*pchar
   segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                 ; non-zero-length segment without any colon ":"

   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

   query         = *( pchar / "/" / "?" )

   fragment      = *( pchar / "/" / "?" )

   pct-encoded   = "%" HEXDIG HEXDIG

   unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
   reserved      = gen-delims / sub-delims
   gen-delims    = ":" / "/" / "?" / "#" / "[" / "]" / "@"
   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Appendix B.  Parsing a URI Reference with a Regular Expression

   As the "first-match-wins" algorithm is identical to the "greedy"
   disambiguation method used by POSIX regular expressions, it is
   natural and commonplace to use a regular expression for parsing the
   potential five components of a URI reference.

   The following line is the regular expression for breaking-down a
   well-formed URI reference into its components.



Berners-Lee, et al.         Standards Track                    [Page 50]

RFC 3986                   URI Generic Syntax               January 2005


      ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
       12            3  4          5       6  7        8 9

   The numbers in the second line above are only to assist readability;
   they indicate the reference points for each subexpression (i.e., each
   paired parenthesis).  We refer to the value matched for subexpression
   <n> as $<n>.  For example, matching the above expression to

      http://www.ics.uci.edu/pub/ietf/uri/#Related

   results in the following subexpression matches:

      $1 = http:
      $2 = http
      $3 = //www.ics.uci.edu
      $4 = www.ics.uci.edu
      $5 = /pub/ietf/uri/
      $6 = <undefined>
      $7 = <undefined>
      $8 = #Related
      $9 = Related

   where <undefined> indicates that the component is not present, as is
   the case for the query component in the above example.  Therefore, we
   can determine the value of the five components as

      scheme    = $2
      authority = $4
      path      = $5
      query     = $7
      fragment  = $9

   Going in the opposite direction, we can recreate a URI reference from
   its components by using the algorithm of Section 5.3.

Appendix C.  Delimiting a URI in Context

   URIs are often transmitted through formats that do not provide a
   clear context for their interpretation.  For example, there are many
   occasions when a URI is included in plain text; examples include text
   sent in email, USENET news, and on printed paper.  In such cases, it
   is important to be able to delimit the URI from the rest of the text,
   and in particular from punctuation marks that might be mistaken for
   part of the URI.

   In practice, URIs are delimited in a variety of ways, but usually
   within double-quotes "http://example.com/", angle brackets
   <http://example.com/>, or just by using whitespace:



Berners-Lee, et al.         Standards Track                    [Page 51]

RFC 3986                   URI Generic Syntax               January 2005


      http://example.com/

   These wrappers do not form part of the URI.

   In some cases, extra whitespace (spaces, line-breaks, tabs, etc.) may
   have to be added to break a long URI across lines.  The whitespace
   should be ignored when the URI is extracted.

   No whitespace should be introduced after a hyphen ("-") character.
   Because some typesetters and printers may (erroneously) introduce a
   hyphen at the end of line when breaking it, the interpreter of a URI
   containing a line break immediately after a hyphen should ignore all
   whitespace around the line break and should be aware that the hyphen
   may or may not actually be part of the URI.

   Using <> angle brackets around each URI is especially recommended as
   a delimiting style for a reference that contains embedded whitespace.

   The prefix "URL:" (with or without a trailing space) was formerly
   recommended as a way to help distinguish a URI from other bracketed
   designators, though it is not commonly used in practice and is no
   longer recommended.

   For robustness, software that accepts user-typed URI should attempt
   to recognize and strip both delimiters and embedded whitespace.

   For example, the text

      Yes, Jim, I found it under "http://www.w3.org/Addressing/",
      but you can probably pick it up from <ftp://foo.example.
      com/rfc/>.  Note the warning in <http://www.ics.uci.edu/pub/
      ietf/uri/historical.html#WARNING>.

   contains the URI references

      http://www.w3.org/Addressing/
      ftp://foo.example.com/rfc/
      http://www.ics.uci.edu/pub/ietf/uri/historical.html#WARNING













Berners-Lee, et al.         Standards Track                    [Page 52]

RFC 3986                   URI Generic Syntax               January 2005


Appendix D.  Changes from RFC 2396

D.1.  Additions

   An ABNF rule for URI has been introduced to correspond to one common
   usage of the term: an absolute URI with optional fragment.

   IPv6 (and later) literals have been added to the list of possible
   identifiers for the host portion of an authority component, as
   described by [RFC2732], with the addition of "[" and "]" to the
   reserved set and a version flag to anticipate future versions of IP
   literals.  Square brackets are now specified as reserved within the
   authority component and are not allowed outside their use as
   delimiters for an IP literal within host.  In order to make this
   change without changing the technical definition of the path, query,
   and fragment components, those rules were redefined to directly
   specify the characters allowed.

   As [RFC2732] defers to [RFC3513] for definition of an IPv6 literal
   address, which, unfortunately, lacks an ABNF description of
   IPv6address, we created a new ABNF rule for IPv6address that matches
   the text representations defined by Section 2.2 of [RFC3513].
   Likewise, the definition of IPv4address has been improved in order to
   limit each decimal octet to the range 0-255.

   Section 6, on URI normalization and comparison, has been completely
   rewritten and extended by using input from Tim Bray and discussion
   within the W3C Technical Architecture Group.

D.2.  Modifications

   The ad-hoc BNF syntax of RFC 2396 has been replaced with the ABNF of
   [RFC2234].  This change required all rule names that formerly
   included underscore characters to be renamed with a dash instead.  In
   addition, a number of syntax rules have been eliminated or simplified
   to make the overall grammar more comprehensible.  Specifications that
   refer to the obsolete grammar rules may be understood by replacing
   those rules according to the following table:













Berners-Lee, et al.         Standards Track                    [Page 53]

RFC 3986                   URI Generic Syntax               January 2005


   +----------------+--------------------------------------------------+
   | obsolete rule  | translation                                      |
   +----------------+--------------------------------------------------+
   | absoluteURI    | absolute-URI                                     |
   | relativeURI    | relative-part [ "?" query ]                      |
   | hier_part      | ( "//" authority path-abempty /                  |
   |                | path-absolute ) [ "?" query ]                    |
   |                |                                                  |
   | opaque_part    | path-rootless [ "?" query ]                      |
   | net_path       | "//" authority path-abempty                      |
   | abs_path       | path-absolute                                    |
   | rel_path       | path-rootless                                    |
   | rel_segment    | segment-nz-nc                                    |
   | reg_name       | reg-name                                         |
   | server         | authority                                        |
   | hostport       | host [ ":" port ]                                |
   | hostname       | reg-name                                         |
   | path_segments  | path-abempty                                     |
   | param          | *<pchar excluding ";">                           |
   |                |                                                  |
   | uric           | unreserved / pct-encoded / ";" / "?" / ":"       |
   |                |  / "@" / "&" / "=" / "+" / "$" / "," / "/"       |
   |                |                                                  |
   | uric_no_slash  | unreserved / pct-encoded / ";" / "?" / ":"       |
   |                |  / "@" / "&" / "=" / "+" / "$" / ","             |
   |                |                                                  |
   | mark           | "-" / "_" / "." / "!" / "~" / "*" / "'"          |
   |                |  / "(" / ")"                                     |
   |                |                                                  |
   | escaped        | pct-encoded                                      |
   | hex            | HEXDIG                                           |
   | alphanum       | ALPHA / DIGIT                                    |
   +----------------+--------------------------------------------------+

   Use of the above obsolete rules for the definition of scheme-specific
   syntax is deprecated.

   Section 2, on characters, has been rewritten to explain what
   characters are reserved, when they are reserved, and why they are
   reserved, even when they are not used as delimiters by the generic
   syntax.  The mark characters that are typically unsafe to decode,
   including the exclamation mark ("!"), asterisk ("*"), single-quote
   ("'"), and open and close parentheses ("(" and ")"), have been moved
   to the reserved set in order to clarify the distinction between
   reserved and unreserved and, hopefully, to answer the most common
   question of scheme designers.  Likewise, the section on
   percent-encoded characters has been rewritten, and URI normalizers
   are now given license to decode any percent-encoded octets



Berners-Lee, et al.         Standards Track                    [Page 54]

RFC 3986                   URI Generic Syntax               January 2005


   corresponding to unreserved characters.  In general, the terms
   "escaped" and "unescaped" have been replaced with "percent-encoded"
   and "decoded", respectively, to reduce confusion with other forms of
   escape mechanisms.

   The ABNF for URI and URI-reference has been redesigned to make them
   more friendly to LALR parsers and to reduce complexity.  As a result,
   the layout form of syntax description has been removed, along with
   the uric, uric_no_slash, opaque_part, net_path, abs_path, rel_path,
   path_segments, rel_segment, and mark rules.  All references to
   "opaque" URIs have been replaced with a better description of how the
   path component may be opaque to hierarchy.  The relativeURI rule has
   been replaced with relative-ref to avoid unnecessary confusion over
   whether they are a subset of URI.  The ambiguity regarding the
   parsing of URI-reference as a URI or a relative-ref with a colon in
   the first segment has been eliminated through the use of five
   separate path matching rules.

   The fragment identifier has been moved back into the section on
   generic syntax components and within the URI and relative-ref rules,
   though it remains excluded from absolute-URI.  The number sign ("#")
   character has been moved back to the reserved set as a result of
   reintegrating the fragment syntax.

   The ABNF has been corrected to allow the path component to be empty.
   This also allows an absolute-URI to consist of nothing after the
   "scheme:", as is present in practice with the "dav:" namespace
   [RFC2518] and with the "about:" scheme used internally by many WWW
   browser implementations.  The ambiguity regarding the boundary
   between authority and path has been eliminated through the use of
   five separate path matching rules.

   Registry-based naming authorities that use the generic syntax are now
   defined within the host rule.  This change allows current
   implementations, where whatever name provided is simply fed to the
   local name resolution mechanism, to be consistent with the
   specification.  It also removes the need to re-specify DNS name
   formats here.  Furthermore, it allows the host component to contain
   percent-encoded octets, which is necessary to enable
   internationalized domain names to be provided in URIs, processed in
   their native character encodings at the application layers above URI
   processing, and passed to an IDNA library as a registered name in the
   UTF-8 character encoding.  The server, hostport, hostname,
   domainlabel, toplabel, and alphanum rules have been removed.

   The resolving relative references algorithm of [RFC2396] has been
   rewritten with pseudocode for this revision to improve clarity and
   fix the following issues:



Berners-Lee, et al.         Standards Track                    [Page 55]

RFC 3986                   URI Generic Syntax               January 2005


   o  [RFC2396] section 5.2, step 6a, failed to account for a base URI
      with no path.

   o  Restored the behavior of [RFC1808] where, if the reference
      contains an empty path and a defined query component, the target
      URI inherits the base URI's path component.

   o  The determination of whether a URI reference is a same-document
      reference has been decoupled from the URI parser, simplifying the
      URI processing interface within applications in a way consistent
      with the internal architecture of deployed URI processing
      implementations.  The determination is now based on comparison to
      the base URI after transforming a reference to absolute form,
      rather than on the format of the reference itself.  This change
      may result in more references being considered "same-document"
      under this specification than there would be under the rules given
      in RFC 2396, especially when normalization is used to reduce
      aliases.  However, it does not change the status of existing
      same-document references.

   o  Separated the path merge routine into two routines: merge, for
      describing combination of the base URI path with a relative-path
      reference, and remove_dot_segments, for describing how to remove
      the special "." and ".." segments from a composed path.  The
      remove_dot_segments algorithm is now applied to all URI reference
      paths in order to match common implementations and to improve the
      normalization of URIs in practice.  This change only impacts the
      parsing of abnormal references and same-scheme references wherein
      the base URI has a non-hierarchical path.

Index

   A
      ABNF  11
      absolute  27
      absolute-path  26
      absolute-URI  27
      access  9
      authority  17, 18

   B
      base URI  28

   C
      character encoding  4
      character  4
      characters  8, 11
      coded character set  4



Berners-Lee, et al.         Standards Track                    [Page 56]

RFC 3986                   URI Generic Syntax               January 2005


   D
      dec-octet  20
      dereference  9
      dot-segments  23

   F
      fragment  16, 24

   G
      gen-delims  13
      generic syntax  6

   H
      h16  20
      hier-part  16
      hierarchical  10
      host  18

   I
      identifier  5
      IP-literal  19
      IPv4  20
      IPv4address  19, 20
      IPv6  19
      IPv6address  19, 20
      IPvFuture  19

   L
      locator  7
      ls32  20

   M
      merge  32

   N
      name  7
      network-path  26

   P
      path  16, 22, 26
         path-abempty  22
         path-absolute  22
         path-empty  22
         path-noscheme  22
         path-rootless  22
      path-abempty  16, 22, 26
      path-absolute  16, 22, 26
      path-empty  16, 22, 26



Berners-Lee, et al.         Standards Track                    [Page 57]

RFC 3986                   URI Generic Syntax               January 2005


      path-rootless  16, 22
      pchar  23
      pct-encoded  12
      percent-encoding  12
      port  22

   Q
      query  16, 23

   R
      reg-name  21
      registered name  20
      relative  10, 28
      relative-path  26
      relative-ref  26
      remove_dot_segments  33
      representation  9
      reserved  12
      resolution  9, 28
      resource  5
      retrieval  9

   S
      same-document  27
      sameness  9
      scheme  16, 17
      segment  22, 23
         segment-nz  23
         segment-nz-nc  23
      sub-delims  13
      suffix  27

   T
      transcription  8

   U
      uniform  4
      unreserved  13
      URI grammar
         absolute-URI  27
         ALPHA  11
         authority  18
         CR  11
         dec-octet  20
         DIGIT  11
         DQUOTE  11
         fragment  24
         gen-delims  13



Berners-Lee, et al.         Standards Track                    [Page 58]

RFC 3986                   URI Generic Syntax               January 2005


         h16  20
         HEXDIG  11
         hier-part  16
         host  19
         IP-literal  19
         IPv4address  20
         IPv6address  20
         IPvFuture  19
         LF  11
         ls32  20
         OCTET  11
         path  22
         path-abempty  22
         path-absolute  22
         path-empty  22
         path-noscheme  22
         path-rootless  22
         pchar  23
         pct-encoded  12
         port  22
         query  24
         reg-name  21
         relative-ref  26
         reserved  13
         scheme  17
         segment  23
         segment-nz  23
         segment-nz-nc  23
         SP  11
         sub-delims  13
         unreserved  13
         URI  16
         URI-reference  25
         userinfo  18
      URI  16
      URI-reference  25
      URL  7
      URN  7
      userinfo  18












Berners-Lee, et al.         Standards Track                    [Page 59]

RFC 3986                   URI Generic Syntax               January 2005


Authors' Addresses

   Tim Berners-Lee
   World Wide Web Consortium
   Massachusetts Institute of Technology
   77 Massachusetts Avenue
   Cambridge, MA  02139
   USA

   Phone: +1-617-253-5702
   Fax:   +1-617-258-5999
   EMail: timbl@w3.org
   URI:   http://www.w3.org/People/Berners-Lee/


   Roy T. Fielding
   Day Software
   5251 California Ave., Suite 110
   Irvine, CA  92617
   USA

   Phone: +1-949-679-2960
   Fax:   +1-949-679-2972
   EMail: fielding@gbiv.com
   URI:   http://roy.gbiv.com/


   Larry Masinter
   Adobe Systems Incorporated
   345 Park Ave
   San Jose, CA  95110
   USA

   Phone: +1-408-536-3024
   EMail: LMM@acm.org
   URI:   http://larry.masinter.net/















Berners-Lee, et al.         Standards Track                    [Page 60]

RFC 3986                   URI Generic Syntax               January 2005


Full Copyright Statement

   Copyright (C) The Internet Society (2005).

   This document is subject to the rights, licenses and restrictions
   contained in BCP 78, and except as set forth therein, the authors
   retain all their rights.

   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the IETF's procedures with respect to rights in IETF Documents can
   be found in BCP 78 and BCP 79.

   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at ietf-
   ipr@ietf.org.


Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.






Berners-Lee, et al.         Standards Track                    [Page 61]


Added doc/rfc4229.txt.




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






Network Working Group                                      M. Nottingham
Request for Comments: 4229                                      J. Mogul
Category: Informational                                          HP Labs
                                                           December 2005

                    HTTP Header Field Registrations

Status of This Memo

   This memo provides information for the Internet community.  It does
   not specify an Internet standard of any kind.  Distribution of this
   memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2005).

Abstract

   This document defines the initial contents of a permanent IANA
   registry for HTTP header fields and a provisional repository for HTTP
   header fields, per RFC 3864.

Table of Contents

   1. Introduction ....................................................4
   2. Registration Templates ..........................................4
      2.1. Permanent HTTP Header Field Registrations ..................5
         2.1.1. Header field: A-IM ....................................7
         2.1.2. Header field: Accept ..................................8
         2.1.3. Header field: Accept-Additions ........................8
         2.1.4. Header field: Accept-Charset ..........................8
         2.1.5. Header field: Accept-Encoding .........................9
         2.1.6. Header field: Accept-Features .........................9
         2.1.7. Header field: Accept-Language .........................9
         2.1.8. Header field: Accept-Ranges ..........................10
         2.1.9. Header field: Age ....................................10
         2.1.10. Header field: Allow .................................10
         2.1.11. Header field: Alternates ............................10
         2.1.12. Header field: Authentication-Info ...................11
         2.1.13. Header field: Authorization .........................11
         2.1.14. Header field: C-Ext .................................11
         2.1.15. Header field: C-Man .................................12
         2.1.16. Header field: C-Opt .................................12
         2.1.17. Header field: C-PEP .................................12
         2.1.18. Header field: C-PEP-Info ............................13
         2.1.19. Header field: Cache-Control .........................13
         2.1.20. Header field: Connection ............................13



Nottingham & Mogul           Informational                      [Page 1]

RFC 4229                   HTTP Header Fields              December 2005


         2.1.21. Header field: Content-Base ..........................14
         2.1.22. Header field: Content-Disposition ...................14
         2.1.23. Header field: Content-Encoding ......................14
         2.1.24. Header field: Content-ID ............................14
         2.1.25. Header field: Content-Language ......................15
         2.1.26. Header field: Content-Length ........................15
         2.1.27. Header field: Content-Location ......................15
         2.1.28. Header field: Content-MD5 ...........................16
         2.1.29. Header field: Content-Range .........................16
         2.1.30. Header field: Content-Script-Type ...................16
         2.1.31. Header field: Content-Style-Type ....................17
         2.1.32. Header field: Content-Type ..........................17
         2.1.33. Header field: Content-Version .......................17
         2.1.34. Header field: Cookie ................................17
         2.1.35. Header field: Cookie2 ...............................18
         2.1.36. Header field: DAV ...................................18
         2.1.37. Header field: Date ..................................18
         2.1.38. Header field: Default-Style .........................19
         2.1.39. Header field: Delta-Base ............................19
         2.1.40. Header field: Depth .................................19
         2.1.41. Header field: Derived-From ..........................19
         2.1.42. Header field: Destination ...........................20
         2.1.43. Header field: Differential-ID .......................20
         2.1.44. Header field: Digest ................................20
         2.1.45. Header field: ETag ..................................21
         2.1.46. Header field: Expect ................................21
         2.1.47. Header field: Expires ...............................21
         2.1.48. Header field: Ext ...................................22
         2.1.49. Header field: From ..................................22
         2.1.50. Header field: GetProfile ............................22
         2.1.51. Header field: Host ..................................23
         2.1.52. Header field: IM ....................................23
         2.1.53. Header field: If ....................................23
         2.1.54. Header field: If-Match ..............................23
         2.1.55. Header field: If-Modified-Since .....................24
         2.1.56. Header field: If-None-Match .........................24
         2.1.57. Header field: If-Range ..............................24
         2.1.58. Header field: If-Unmodified-Since ...................25
         2.1.59. Header field: Keep-Alive ............................25
         2.1.60. Header field: Label .................................25
         2.1.61. Header field: Last-Modified .........................25
         2.1.62. Header field: Link ..................................26
         2.1.63. Header field: Location ..............................26
         2.1.64. Header field: Lock-Token ............................26
         2.1.65. Header field: MIME-Version ..........................27
         2.1.66. Header field: Man ...................................27
         2.1.67. Header field: Max-Forwards ..........................27
         2.1.68. Header field: Meter .................................27



Nottingham & Mogul           Informational                      [Page 2]

RFC 4229                   HTTP Header Fields              December 2005


         2.1.69. Header field: Negotiate .............................28
         2.1.70. Header field: Opt ...................................28
         2.1.71. Header field: Ordering-Type .........................28
         2.1.72. Header field: Overwrite .............................29
         2.1.73. Header field: P3P ...................................29
         2.1.74. Header field: PEP ...................................29
         2.1.75. Header field: PICS-Label ............................30
         2.1.76. Header field: Pep-Info ..............................30
         2.1.77. Header field: Position ..............................30
         2.1.78. Header field: Pragma ................................31
         2.1.79. Header field: ProfileObject .........................31
         2.1.80. Header field: Protocol ..............................31
         2.1.81. Header field: Protocol-Info .........................32
         2.1.82. Header field: Protocol-Query ........................32
         2.1.83. Header field: Protocol-Request ......................32
         2.1.84. Header field: Proxy-Authenticate ....................32
         2.1.85. Header field: Proxy-Authentication-Info .............33
         2.1.86. Header field: Proxy-Authorization ...................33
         2.1.87. Header field: Proxy-Features ........................33
         2.1.88. Header field: Proxy-Instruction .....................34
         2.1.89. Header field: Public ................................34
         2.1.90. Header field: Range .................................34
         2.1.91. Header field: Referer ...............................34
         2.1.92. Header field: Retry-After ...........................35
         2.1.93. Header field: Safe ..................................35
         2.1.94. Header field: Security-Scheme .......................35
         2.1.95. Header field: Server ................................36
         2.1.96. Header field: Set-Cookie ............................36
         2.1.97. Header field: Set-Cookie2 ...........................36
         2.1.98. Header field: SetProfile ............................36
         2.1.99. Header field: SoapAction ............................37
         2.1.100. Header field: Status-URI ...........................37
         2.1.101. Header field: Surrogate-Capability .................38
         2.1.102. Header field: Surrogate-Control ....................38
         2.1.103. Header field: TCN ..................................38
         2.1.104. Header field: TE ...................................39
         2.1.105. Header field: Timeout ..............................39
         2.1.106. Header field: Trailer ..............................39
         2.1.107. Header field: Transfer-Encoding ....................39
         2.1.108. Header field: URI ..................................40
         2.1.109. Header field: Upgrade ..............................40
         2.1.110. Header field: User-Agent ...........................40
         2.1.111. Header field: Variant-Vary .........................41
         2.1.112. Header field: Vary .................................41
         2.1.113. Header field: Via ..................................41
         2.1.114. Header field: WWW-Authenticate .....................41
         2.1.115. Header field: Want-Digest ..........................42
         2.1.116. Header field: Warning ..............................42



Nottingham & Mogul           Informational                      [Page 3]

RFC 4229                   HTTP Header Fields              December 2005


      2.2. Provisional HTTP Header Field Submissions .................43
         2.2.1. Header field: Compliance .............................43
         2.2.2. Header field: Content-Transfer-Encoding ..............43
         2.2.3. Header field: Cost ...................................44
         2.2.4. Header field: Message-ID .............................44
         2.2.5. Header field: Non-Compliance .........................44
         2.2.6. Header field: Optional ...............................44
         2.2.7. Header field: Resolution-Hint ........................45
         2.2.8. Header field: Resolver-Location ......................45
         2.2.9. Header field: SubOK ..................................46
         2.2.10. Header field: Subst .................................46
         2.2.11. Header field: Title .................................46
         2.2.12. Header field: UA-Color ..............................46
         2.2.13. Header field: UA-Media ..............................47
         2.2.14. Header field: UA-Pixels .............................47
         2.2.15. Header field: UA-Resolution .........................48
         2.2.16. Header field: UA-Windowpixels .......................48
         2.2.17. Header field: Version ...............................48
   3. IANA Considerations ............................................49
   4. Security Considerations ........................................49
   5. Acknowledgements ...............................................49
   6. Informative References .........................................49

1.  Introduction

   HTTP/1.0 [3] and HTTP/1.1 [11] define protocol constructs
   (respectively, the HTTP-header and message-header BNF rules) that are
   used as message headers.  These specifications also define a number
   of HTTP headers themselves, and they provide for extension through
   the use of new field-names.

   This document defines the initial contents of an IANA registry that
   catalogs permanent HTTP header field-names, and of an IANA repository
   that catalogs provisional HTTP header field-names.  Both are operated
   according to Registration Procedures for Message Header Fields [1].

   Note that neither tracks the syntax or semantics of field-values.
   Also, while some HTTP headers have different semantics depending on
   their context (e.g., Cache-Control in requests and responses), both
   registries consider the HTTP header field-name name space singular.

   Also, some contact details listed may no longer be correct.

2.  Registration Templates

   Header field entries are summarized in tabular form for convenience
   of reference and presented in full in the following sections.




Nottingham & Mogul           Informational                      [Page 4]

RFC 4229                   HTTP Header Fields              December 2005


2.1.  Permanent HTTP Header Field Registrations

   Header name             Protocol
   -----------             --------
   A-IM                      http
   Accept                    http
   Accept-Additions          http
   Accept-Charset            http
   Accept-Encoding           http
   Accept-Features           http
   Accept-Language           http
   Accept-Ranges             http
   Age                       http
   Allow                     http
   Alternates                http
   Authentication-Info       http
   Authorization             http
   C-Ext                     http
   C-Man                     http
   C-Opt                     http
   C-PEP                     http
   C-PEP-Info                http
   Cache-Control             http
   Connection                http
   Content-Base              http
   Content-Disposition       http
   Content-Encoding          http
   Content-ID                http
   Content-Language          http
   Content-Length            http
   Content-Location          http
   Content-MD5               http
   Content-Range             http
   Content-Script-Type       http
   Content-Style-Type        http
   Content-Type              http
   Content-Version           http
   Cookie                    http
   Cookie2                   http
   DAV                       http
   Date                      http
   Default-Style             http
   Delta-Base                http
   Depth                     http
   Derived-From              http
   Destination               http
   Differential-ID           http
   Digest                    http



Nottingham & Mogul           Informational                      [Page 5]

RFC 4229                   HTTP Header Fields              December 2005


   ETag                      http
   Expect                    http
   Expires                   http
   Ext                       http
   From                      http
   GetProfile                http
   Host                      http
   IM                        http
   If                        http
   If-Match                  http
   If-Modified-Since         http
   If-None-Match             http
   If-Range                  http
   If-Unmodified-Since       http
   Keep-Alive                http
   Label                     http
   Last-Modified             http
   Link                      http
   Location                  http
   Lock-Token                http
   MIME-Version              http
   Man                       http
   Max-Forwards              http
   Meter                     http
   Negotiate                 http
   Opt                       http
   Ordering-Type             http
   Overwrite                 http
   P3P                       http
   PEP                       http
   PICS-Label                http
   Pep-Info                  http
   Position                  http
   Pragma                    http
   ProfileObject             http
   Protocol                  http
   Protocol-Info             http
   Protocol-Query            http
   Protocol-Request          http
   Proxy-Authenticate        http
   Proxy-Authentication-Info http
   Proxy-Authorization       http
   Proxy-Features            http
   Proxy-Instruction         http
   Public                    http
   Range                     http
   Referer                   http
   Retry-After               http



Nottingham & Mogul           Informational                      [Page 6]

RFC 4229                   HTTP Header Fields              December 2005


   Safe                      http
   Security-Scheme           http
   Server                    http
   Set-Cookie                http
   Set-Cookie2               http
   SetProfile                http
   SoapAction                http
   Status-URI                http
   Surrogate-Capability      http
   Surrogate-Control         http
   TCN                       http
   TE                        http
   Timeout                   http
   Trailer                   http
   Transfer-Encoding         http
   URI                       http
   Upgrade                   http
   User-Agent                http
   Variant-Vary              http
   Vary                      http
   Via                       http
   WWW-Authenticate          http
   Want-Digest               http
   Warning                   http

2.1.1.  Header field: A-IM

   Applicable protocol:     http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3229 [16]














Nottingham & Mogul           Informational                      [Page 7]

RFC 4229                   HTTP Header Fields              December 2005


2.1.2.  Header field: Accept

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.3.  Header field: Accept-Additions

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2324 [9]

   Related information: spoof

2.1.4.  Header field: Accept-Charset

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]











Nottingham & Mogul           Informational                      [Page 8]

RFC 4229                   HTTP Header Fields              December 2005


2.1.5.  Header field: Accept-Encoding

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.6.  Header field: Accept-Features

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Koen Holtman  (koen@win.tue.nl)

   Specification document(s):
      RFC2295 [7]

2.1.7.  Header field: Accept-Language

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]













Nottingham & Mogul           Informational                      [Page 9]

RFC 4229                   HTTP Header Fields              December 2005


2.1.8.  Header field: Accept-Ranges

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.9.  Header field: Age

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.10.  Header field: Allow

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.11.  Header field: Alternates

   Applicable protocol: http [11]

   Status: experimental







Nottingham & Mogul           Informational                     [Page 10]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Koen Holtman  (koen@win.tue.nl)

   Specification document(s):
      RFC2295 [7]

2.1.12.  Header field: Authentication-Info

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2617 [12]

2.1.13.  Header field: Authorization

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.14.  Header field: C-Ext

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]





Nottingham & Mogul           Informational                     [Page 11]

RFC 4229                   HTTP Header Fields              December 2005


2.1.15.  Header field: C-Man

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]

2.1.16.  Header field: C-Opt

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]

2.1.17.  Header field: C-PEP

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Dan Connolly  (connolly@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Rohit Khare  (khare@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Eric Prud'hommeaux  (eric@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science

   Specification document(s):
      PEP [29]





Nottingham & Mogul           Informational                     [Page 12]

RFC 4229                   HTTP Header Fields              December 2005


2.1.18.  Header field: C-PEP-Info

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Dan Connolly  (connolly@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Rohit Khare  (khare@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Eric Prud'hommeaux  (eric@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science

      Specification document(s):
         PEP [29]

2.1.19.  Header field: Cache-Control

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.20.  Header field: Connection

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]







Nottingham & Mogul           Informational                     [Page 13]

RFC 4229                   HTTP Header Fields              December 2005


2.1.21.  Header field: Content-Base

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.22.  Header field: Content-Disposition

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.23.  Header field: Content-Encoding

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.24.  Header field: Content-ID

   Applicable protocol: http [11]

   Status: informational







Nottingham & Mogul           Informational                     [Page 14]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      Arthur van Hoff  (avh@marimba.com)
      Marimba Inc.
      John Giannandrea  (jg@netscape.com)
      Netscape Inc.
      Mark Hapner  (mark.hapner@sun.com)
      Sun Microsystems Inc.
      Steve Carter  (srcarter@novell.com)
      Novell Inc.
      Milo Medin  (medin@home.net)
      At Home Corp

   Specification document(s):
      DRP [20]

2.1.25.  Header field: Content-Language

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.26.  Header field: Content-Length

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.27.  Header field: Content-Location

   Applicable protocol: http [11]

   Status: standard





Nottingham & Mogul           Informational                     [Page 15]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.28.  Header field: Content-MD5

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.29.  Header field: Content-Range

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.30.  Header field: Content-Script-Type

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      HTML 4 [21]






Nottingham & Mogul           Informational                     [Page 16]

RFC 4229                   HTTP Header Fields              December 2005


2.1.31.  Header field: Content-Style-Type

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      HTML 4 [21]

2.1.32.  Header field: Content-Type

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.33.  Header field: Content-Version

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.34.  Header field: Cookie

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 17]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2965 [15]

2.1.35.  Header field: Cookie2

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2965 [15]

2.1.36.  Header field: DAV

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.37.  Header field: Date

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]






Nottingham & Mogul           Informational                     [Page 18]

RFC 4229                   HTTP Header Fields              December 2005


2.1.38.  Header field: Default-Style

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      HTML 4 [21]

2.1.39.  Header field: Delta-Base

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3229 [16]

2.1.40.  Header field: Depth

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.41.  Header field: Derived-From

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 19]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.42.  Header field: Destination

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.43.  Header field: Differential-ID

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Arthur van Hoff  (avh@marimba.com)
      Marimba Inc.
      John Giannandrea  (jg@netscape.com)
      Netscape Inc.
      Mark Hapner  (mark.hapner@sun.com)
      Sun Microsystems Inc.
      Steve Carter  (srcarter@novell.com)
      Novell Inc.
      Milo Medin  (medin@home.net)
      At Home Corp

   Specification document(s):
      DRP [20]

2.1.44.  Header field: Digest

   Applicable protocol: http [11]

   Status: standard





Nottingham & Mogul           Informational                     [Page 20]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3230 [17]

2.1.45.  Header field: ETag

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.46.  Header field: Expect

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.47.  Header field: Expires

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]






Nottingham & Mogul           Informational                     [Page 21]

RFC 4229                   HTTP Header Fields              December 2005


2.1.48.  Header field: Ext

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]

2.1.49.  Header field: From

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.50.  Header field: GetProfile

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Pat Hensley  (hensley@firefly.net)
      FireFly Network, Inc.
      Max Metral  (max@firefly.net)
      FireFly Network, Inc.
      Upendra Shardanand  (shard@firefly.net)
      FireFly Network, Inc.
      Donna Converse  (converse@netscape.com)
      Netscape Communications
      Mike Myers  (mmyers@verisign.com)
      Verisign, Inc.

   Specification document(s):
      OPS over HTTP [22]




Nottingham & Mogul           Informational                     [Page 22]

RFC 4229                   HTTP Header Fields              December 2005


2.1.51.  Header field: Host

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.52.  Header field: IM

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3229 [16]

2.1.53.  Header field: If

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.54.  Header field: If-Match

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 23]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.55.  Header field: If-Modified-Since

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.56.  Header field: If-None-Match

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.57.  Header field: If-Range

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]






Nottingham & Mogul           Informational                     [Page 24]

RFC 4229                   HTTP Header Fields              December 2005


2.1.58.  Header field: If-Unmodified-Since

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.59.  Header field: Keep-Alive

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.60.  Header field: Label

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3253 [18]

2.1.61.  Header field: Last-Modified

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 25]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.62.  Header field: Link

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.63.  Header field: Location

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.64.  Header field: Lock-Token

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]






Nottingham & Mogul           Informational                     [Page 26]

RFC 4229                   HTTP Header Fields              December 2005


2.1.65.  Header field: MIME-Version

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.66.  Header field: Man

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]

2.1.67.  Header field: Max-Forwards

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.68.  Header field: Meter

   Applicable protocol: http [11]

   Status: standard






Nottingham & Mogul           Informational                     [Page 27]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2227 [6]

2.1.69.  Header field: Negotiate

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Koen Holtman  (koen@win.tue.nl)

   Specification document(s):
      RFC2295 [7]

2.1.70.  Header field: Opt

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@microsoft.com)
      Paul J. Leach  (paulle@microsoft.com)
      Scott Lawrence  (lawrence@agranat.com)

   Specification document(s):
      RFC2774 [14]

2.1.71.  Header field: Ordering-Type

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3648 [19]





Nottingham & Mogul           Informational                     [Page 28]

RFC 4229                   HTTP Header Fields              December 2005


2.1.72.  Header field: Overwrite

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.73.  Header field: P3P

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      P3P [23]

2.1.74.  Header field: PEP

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Dan Connolly  (connolly@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Rohit Khare  (khare@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Eric Prud'hommeaux  (eric@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science

   Specification document(s):
      PEP [29]







Nottingham & Mogul           Informational                     [Page 29]

RFC 4229                   HTTP Header Fields              December 2005


2.1.75.  Header field: PICS-Label

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      PICSLabels [24]

2.1.76.  Header field: Pep-Info

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Dan Connolly  (connolly@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Rohit Khare  (khare@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science
      Eric Prud'hommeaux  (eric@w3.org)
      World Wide Web Consortium, MIT Laboratory for Computer Science

   Specification document(s):  PEP [29]

2.1.77.  Header field: Position

      Applicable protocol: http [11]

      Status: standard

      Author/change controller:
         IETF  (iesg@ietf.org)
         Internet Engineering Task Force

      Specification document(s):
         RFC3648 [19]








Nottingham & Mogul           Informational                     [Page 30]

RFC 4229                   HTTP Header Fields              December 2005


2.1.78.  Header field: Pragma

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.79.  Header field: ProfileObject

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Pat Hensley  (hensley@firefly.net)
      FireFly Network, Inc.
      Max Metral  (max@firefly.net)
      FireFly Network, Inc.
      Upendra Shardanand  (shard@firefly.net)
      FireFly Network, Inc.
      Donna Converse  (converse@netscape.com)
      Netscape Communications
      Mike Myers  (mmyers@verisign.com)
      Verisign, Inc.

   Specification document(s):
      OPS over HTTP [22]

2.1.80.  Header field: Protocol

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      PICSLabels [24]





Nottingham & Mogul           Informational                     [Page 31]

RFC 4229                   HTTP Header Fields              December 2005


2.1.81.  Header field: Protocol-Info

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Don Eastlake  (dee@cybercash.com)
      Rohit Khare  (khare@w3.org)
      Jim Miller  (jmiller@w3.org)

   Specification document(s):
      Selecting Payment Mechanisms [26]

2.1.82.  Header field: Protocol-Query

   Applicable protocol: http [11]

   Status: deprecated

   Author/change controller:
      Don Eastlake  (dee@cybercash.com)
      Rohit Khare  (khare@w3.org)
      Jim Miller  (jmiller@w3.org)

   Specification document(s):
      Selecting Payment Mechanisms [26]

2.1.83.  Header field: Protocol-Request

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      W3C  (web-human@w3.org)
      World Wide Web Consortium

   Specification document(s):
      PICSLabels [24]

2.1.84.  Header field: Proxy-Authenticate

   Applicable protocol: http [11]

   Status: standard





Nottingham & Mogul           Informational                     [Page 32]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.85.  Header field: Proxy-Authentication-Info

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2617 [12]

2.1.86.  Header field: Proxy-Authorization

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.87.  Header field: Proxy-Features

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Phillip M. Hallam-Baker  (hallam@w3.org)
      W3C

   Specification document(s):
      Proxy Notification [27]






Nottingham & Mogul           Informational                     [Page 33]

RFC 4229                   HTTP Header Fields              December 2005


2.1.88.  Header field: Proxy-Instruction

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Phillip M. Hallam-Baker  (hallam@w3.org)
      W3C

   Specification document(s):
      Proxy Notification [27]

2.1.89.  Header field: Public

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.90.  Header field: Range

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.91.  Header field: Referer

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 34]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.92.  Header field: Retry-After

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.93.  Header field: Safe

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Koen Holtman  (koen@win.tue.nl)

   Specification document(s):
      RFC2310 [8]

2.1.94.  Header field: Security-Scheme

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Eric Rescorla  (ekr@rtfm.com)
      A. Schiffman  (ams@terisa.com)

   Specification document(s):
      RFC2660 [13]







Nottingham & Mogul           Informational                     [Page 35]

RFC 4229                   HTTP Header Fields              December 2005


2.1.95.  Header field: Server

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.96.  Header field: Set-Cookie

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2109 [5]

2.1.97.  Header field: Set-Cookie2

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2965 [15]

2.1.98.  Header field: SetProfile

   Applicable protocol: http [11]

   Status: informational







Nottingham & Mogul           Informational                     [Page 36]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      Pat Hensley  (hensley@firefly.net)
      FireFly Network, Inc.
      Max Metral  (max@firefly.net)
      FireFly Network, Inc.
      Upendra Shardanand  (shard@firefly.net)
      FireFly Network, Inc.
      Donna Converse  (converse@netscape.com)
      Netscape Communications
      Mike Myers  (mmyers@verisign.com)
      Verisign, Inc.

   Specification document(s):
      OPS over HTTP [22]

2.1.99.  Header field: SoapAction

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Don Box  (dbox@develop.com)
      DevelopMentor
      David Ehnebuske  (davide@us.ibm.com)
      IBM
      Gopal Kakivaya  (gopalk@microsoft.com)
      Microsoft
      Andrew Layman  (andrewl@microsoft.com)
      Microsoft
      Noah Mendelsohn  (Noah_Mendelsohn@lotus.com)
      Lotus Development Corp.
      Hernik Frystyk Nielsen  (frystyk@microsoft.com)
      Microsoft
      Satish Thatte  (satisht@microsoft.com)
      Microsoft
      Dave Winer  (dave@userland.com)
      UserLand Software, Inc.

   Specification document(s):
      SOAP [28]

2.1.100.  Header field: Status-URI

   Applicable protocol: http [11]

   Status: standard




Nottingham & Mogul           Informational                     [Page 37]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.101.  Header field: Surrogate-Capability

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Mark Nottingham  (mnot@akamai.com)
      Akamai
      Xiang Liu  (xiang.liu@oracle.com)
      Oracle

   Specification document(s):
      edge-arch [25]

2.1.102.  Header field: Surrogate-Control

   Applicable protocol: http [11]

   Status: informational

   Author/change controller:
      Mark Nottingham  (mnot@akamai.com)
      Akamai
      Xiang Liu  (xiang.liu@oracle.com)
      Oracle

   Specification document(s):
      edge-arch [25]

2.1.103.  Header field: TCN

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Koen Holtman  (koen@win.tue.nl)





Nottingham & Mogul           Informational                     [Page 38]

RFC 4229                   HTTP Header Fields              December 2005


   Specification document(s):
      RFC2295 [7]

2.1.104.  Header field: TE

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.105.  Header field: Timeout

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2518 [10]

2.1.106.  Header field: Trailer

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.107.  Header field: Transfer-Encoding

   Applicable protocol: http [11]

   Status: standard




Nottingham & Mogul           Informational                     [Page 39]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.108.  Header field: URI

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2068 [4]

2.1.109.  Header field: Upgrade

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.110.  Header field: User-Agent

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]






Nottingham & Mogul           Informational                     [Page 40]

RFC 4229                   HTTP Header Fields              December 2005


2.1.111.  Header field: Variant-Vary

   Applicable protocol: http [11]

   Status: experimental

   Author/change controller:
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Koen Holtman  (koen@win.tue.nl)

   Specification document(s):
      RFC2295 [7]

2.1.112.  Header field: Vary

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.113.  Header field: Via

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.114.  Header field: WWW-Authenticate

   Applicable protocol: http [11]

   Status: standard







Nottingham & Mogul           Informational                     [Page 41]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]

2.1.115.  Header field: Want-Digest

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC3230 [17]

2.1.116.  Header field: Warning

   Applicable protocol: http [11]

   Status: standard

   Author/change controller:
      IETF  (iesg@ietf.org)
      Internet Engineering Task Force

   Specification document(s):
      RFC2616 [11]



















Nottingham & Mogul           Informational                     [Page 42]

RFC 4229                   HTTP Header Fields              December 2005


2.2.  Provisional HTTP Header Field Submissions

   Header name             Protocol
   -----------             --------
   Compliance                http
   Content-Transfer-Encoding http
   Cost                      http
   Message-ID                http
   Non-Compliance            http
   Optional                  http
   Resolution-Hint           http
   Resolver-Location         http
   SubOK                     http
   Subst                     http
   Title                     http
   UA-Color                  http
   UA-Media                  http
   UA-Pixels                 http
   UA-Resolution             http
   UA-Windowpixels           http
   Version                   http

2.2.1.  Header field: Compliance

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:  Jeffrey C. Mogul  (mogul@wrl.dec.com)
      Western Research Laboratory, Digital Equipment Corporation Josh
      Cohen  (josh@netscape.com) Netscape Communications Corporation
      Scott Lawrence  (lawrence@agranat.com) Agranat Systems, Inc.

   Specification document(s):
      OPTIONS messages [31]

2.2.2.  Header field: Content-Transfer-Encoding

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Tim Berners-Lee  (timbl@w3.org)
      MIT Laboratory for Computer Science






Nottingham & Mogul           Informational                     [Page 43]

RFC 4229                   HTTP Header Fields              December 2005


   Specification document(s):
      Object Headers [2]

2.2.3.  Header field: Cost

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Tim Berners-Lee  (timbl@w3.org)
      MIT Laboratory for Computer Science

   Specification document(s):
      Object Headers [2]

2.2.4.  Header field: Message-ID

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Tim Berners-Lee  (timbl@w3.org)
      MIT Laboratory for Computer Science

   Specification document(s):
      Object Headers [2]

2.2.5.  Header field: Non-Compliance

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:  Jeffrey C. Mogul  (mogul@wrl.dec.com)
      Western Research Laboratory, Digital Equipment Corporation Josh
      Cohen  (josh@netscape.com) Netscape Communications Corporation
      Scott Lawrence  (lawrence@agranat.com) Agranat Systems, Inc.

   Specification document(s):
      OPTIONS messages [31]

2.2.6.  Header field: Optional

   Applicable protocol: http [11]

   Status: provisional



Nottingham & Mogul           Informational                     [Page 44]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      John Mallery  (jcma@ai.mit.edu)
      MIT Artificial Intelligence Laboratory
      Lewis Girod  (girod@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Benjie Chen  (benjie@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium

   Specification document(s):
      WIRE [32]

2.2.7.  Header field: Resolution-Hint

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      John Mallery  (jcma@ai.mit.edu)
      MIT Artificial Intelligence Laboratory
      Lewis Girod  (girod@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Benjie Chen  (benjie@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium

   Specification document(s):
      WIRE [32]

2.2.8.  Header field: Resolver-Location

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      John Mallery  (jcma@ai.mit.edu)
      MIT Artificial Intelligence Laboratory
      Lewis Girod  (girod@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Benjie Chen  (benjie@lcs.mit.edu)
      MIT Laboratory for Computer Science
      Henrik Frystyk Nielsen  (frystyk@w3.org)
      World Wide Web Consortium




Nottingham & Mogul           Informational                     [Page 45]

RFC 4229                   HTTP Header Fields              December 2005


   Specification document(s):
      WIRE [32]

2.2.9.  Header field: SubOK

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:  Jeffrey C. Mogul  (mogul@wrl.dec.com)
      Western Research Laboratory, Digital Equipment Corporation Arthur
      van Hoff  (avh@marimba.com) Marimba, Inc.

   Specification document(s):
      Duplicate Suppression [33]

2.2.10.  Header field: Subst

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:  Jeffrey C. Mogul  (mogul@wrl.dec.com)
      Western Research Laboratory, Digital Equipment Corporation Arthur
      van Hoff  (avh@marimba.com) Marimba, Inc.

   Specification document(s):
      Duplicate Suppression [33]

2.2.11.  Header field: Title

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Tim Berners-Lee  (timbl@w3.org)
      MIT Laboratory for Computer Science

   Specification document(s):
      Object Headers [2]

2.2.12.  Header field: UA-Color

   Applicable protocol: http [11]

   Status: provisional




Nottingham & Mogul           Informational                     [Page 46]

RFC 4229                   HTTP Header Fields              December 2005


   Author/change controller:
      Larry Masinter  (LMM@acm.org)
      Adobe Systems
      Lou Montulli  (montulli@netscape.com)
      Netscape Communications Corp.
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Hewlett-Packard Company

   Specification document(s):
      UA Attributes [30]

2.2.13.  Header field: UA-Media

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Larry Masinter  (LMM@acm.org)
      Adobe Systems
      Lou Montulli  (montulli@netscape.com)
      Netscape Communications Corp.
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Hewlett-Packard Company

   Specification document(s):
      UA Attributes [30]

2.2.14.  Header field: UA-Pixels

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Larry Masinter  (LMM@acm.org)
      Adobe Systems
      Lou Montulli  (montulli@netscape.com)
      Netscape Communications Corp.
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Hewlett-Packard Company

   Specification document(s):
      UA Attributes [31]







Nottingham & Mogul           Informational                     [Page 47]

RFC 4229                   HTTP Header Fields              December 2005


2.2.15.  Header field: UA-Resolution

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Larry Masinter  (LMM@acm.org)
      Adobe Systems
      Lou Montulli  (montulli@netscape.com)
      Netscape Communications Corp.
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Hewlett-Packard Company

   Specification document(s):
      UA Attributes [30]

2.2.16.  Header field: UA-Windowpixels

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Larry Masinter  (LMM@acm.org)
      Adobe Systems
      Lou Montulli  (montulli@netscape.com)
      Netscape Communications Corp.
      Andrew H. Mutz  (mutz@hpl.hp.com)
      Hewlett-Packard Company

   Specification document(s):
      UA Attributes [30]

2.2.17.  Header field: Version

   Applicable protocol: http [11]

   Status: provisional

   Author/change controller:
      Tim Berners-Lee  (timbl@w3.org)
      MIT Laboratory for Computer Science

   Specification document(s):
      Object Headers [2]





Nottingham & Mogul           Informational                     [Page 48]

RFC 4229                   HTTP Header Fields              December 2005


3.  IANA Considerations

   This specification provides initial registrations of HTTP header
   fields in the "Permanent Message Header Field Registry", defined by
   Registration Procedures for Message Header Fields [1].

   It also provides initial submissions of HTTP header fields in the
   "Provisional Message Header Field Repository", defined by the same
   document.

4.  Security Considerations

   No security considerations are introduced by this document beyond
   those already inherent in use of the HTTP header fields referenced.

5.  Acknowledgements

   The authors would like to thank Graham Klyne for his work in defining
   the message header registries, his input and help in preparing this
   document, and the registry generation software.

6.  Informative References

   [1]   Klyne, G., Nottingham, M., and J. Mogul, "Registration
         Procedures for Message Header Fields", BCP 90, RFC 3864,
         September 2004.

   [2]   Berners-Lee, T., "Object Header lines in HTTP", May 1994,
         <http://www.w3.org/Protocols/HTTP/Object_Headers.html>.

   [3]   Berners-Lee, T., Fielding, R., and H. Nielsen, "Hypertext
         Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996.

   [4]   Fielding, R., Gettys, J., Mogul, J., Nielsen, H., and T.
         Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC
         2068, January 1997.

   [5]   Kristol, D. and L. Montulli, "HTTP State Management Mechanism",
         RFC 2109, February 1997.

   [6]   Mogul, J. and P. Leach, "Simple Hit-Metering and Usage-Limiting
         for HTTP", RFC 2227, October 1997.

   [7]   Holtman, K. and A. Mutz, "Transparent Content Negotiation in
         HTTP", RFC 2295, March 1998.

   [8]   Holtman, K., "The Safe Response Header Field", RFC 2310, April
         1998.



Nottingham & Mogul           Informational                     [Page 49]

RFC 4229                   HTTP Header Fields              December 2005


   [9]   Masinter, L., "Hyper Text Coffee Pot Control Protocol
         (HTCPCP/1.0)", RFC 2324, April 1998.

   [10]  Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
         Jensen, "HTTP Extensions for Distributed Authoring -- WEBDAV",
         RFC 2518, February 1999.

   [11]  Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
         Leach, P., and T. Berners-Lee, "Hypertext Transfer Protocol --
         HTTP/1.1", RFC 2616, June 1999.

   [12]  Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
         Leach, P., Luotonen, A., and L. Stewart, "HTTP Authentication:
         Basic and Digest Access Authentication", RFC 2617, June 1999.

   [13]  Rescorla, E. and A. Schiffman, "The Secure HyperText Transfer
         Protocol", RFC 2660, August 1999.

   [14]  Nielsen, H., Leach, P., and S. Lawrence, "An HTTP Extension
         Framework", RFC 2774, February 2000.

   [15]  Kristol, D. and L. Montulli, "HTTP State Management Mechanism",
         RFC 2965, October 2000.

   [16]  Mogul, J., Krishnamurthy, B., Douglis, F., Feldmann, A.,
         Goland, Y., van Hoff, A., and D. Hellerstein, "Delta encoding
         in HTTP", RFC 3229, January 2002.

   [17]  Mogul, J. and A. Van Hoff, "Instance Digests in HTTP", RFC
         3230, January 2002.

   [18]  Clemm, G., Amsden, J., Ellison, T., Kaler, C., and J.
         Whitehead, "Versioning Extensions to WebDAV (Web Distributed
         Authoring and Versioning)", RFC 3253, March 2002.

   [19]  Whitehead, J. and J. Reschke, Ed., "Web Distributed Authoring
         and Versioning (WebDAV) Ordered Collections Protocol", RFC
         3648, December 2003.

   [20]  Hoff, A., Payne, J., Hapner, M., Carter, S., and M. Medin, "The
         HTTP Distribution and Replication Protocol", W3C NOTE NOTE-
         drp-19970825, August 1997.

   [21]  Raggett, D., Hors, A., and I. Jacobs, "HTML 4.01
         Specification", W3C REC REC-html401-19991224, December 1999.






Nottingham & Mogul           Informational                     [Page 50]

RFC 4229                   HTTP Header Fields              December 2005


   [22]  Hensley, P., Metral, M., Shardanand, U., Converse, D., and M.
         Myers, "Implementation of OPS Over HTTP", W3C NOTE NOTE-OPS-
         OverHTTP, June 1997.

   [23]  Marchiori, M., "The Platform for Privacy Preferences 1.0
         (P3P1.0) Specification", W3C REC REC-P3P-20020416, April 2002.

   [24]  Krauskopf, T., Miller, J., Resnick, P., and W. Treese, "PICS
         1.1 Label Distribution -- Label Syntax and Communication
         Protocols", W3C REC REC-PICS-labels-961031, October 1996.

   [25]  Nottingham, M. and X. Liu, "Edge Architecture Specification",
         W3C NOTE NOTE-edge-arch-20010804, August 2001.

   [26]  Chung, E. and D. Dardailler, "White Paper: Joint Electronic
         Payment Initiative", W3C NOTE NOTE-jepi-970519, May 1997.

   [27]  Hallam-Baker, P., "Notification for Proxy Caches", W3C NOTE WD-
         proxy-960221, February 1996.

   [28]  Box, D., Ehnebuske, D., Kakivaya, G., Layman, A., Mendelsohn,
         N., Nielsen, H., Thatte, S., and D. Winer, "Simple Object
         Access Protocol (SOAP) 1.1", W3C NOTE NOTE-SOAP-20000508, May
         2000.

   [29]  Connolly, D., Prod'hommeaux, E., Nielsen, H., and R. Khare,
         "PEP Specification: an Extension Mechanism for HTTP", Nov 1998,
         <http://www.w3.org/TR/WD-http-pep>.

   [30]  Masinter, L., Montulli, L., and A. Mutz, "User-Agent Display
         Attributes Headers", Work in Progress, November 1996.

   [31]  Mogul, J., Cohen, J., and S. Lawrence, "Specification of
         HTTP/1.1 OPTIONS messages", Work in Progress, August 1997.

   [32]  Girod, L., Chen, B., Henrik, H., and J. Mallery, "WIRE - W3
         Identifier Resolution Extensions", Work in Progress, March
         1998.

   [33]  Mogul, J. and A. van Hoff, "Duplicate Suppression in HTTP",
         Work in Progress, April 1998.










Nottingham & Mogul           Informational                     [Page 51]

RFC 4229                   HTTP Header Fields              December 2005


Authors' Addresses

   Mark Nottingham

   EMail: mnot@pobox.com
   URI:   http://www.mnot.net/


   Jeffrey C. Mogul
   HP Labs
   1501 Page Mill Road
   Palo Alto, CA  94304
   US

   EMail: JeffMogul@acm.org




































Nottingham & Mogul           Informational                     [Page 52]

RFC 4229                   HTTP Header Fields              December 2005


Full Copyright Statement

   Copyright (C) The Internet Society (2005).

   This document is subject to the rights, licenses and restrictions
   contained in BCP 78, and except as set forth therein, the authors
   retain all their rights.

   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the procedures with respect to rights in RFC documents can be
   found in BCP 78 and BCP 79.

   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at ietf-
   ipr@ietf.org.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.







Nottingham & Mogul           Informational                     [Page 53]


Added doc/rfcs.txt.


























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# on http (minus webdav)

rfc1945.txt
	http/1.0

rfc2145.txt
	about http version numbers

rfc2295.txt
	"Transparent Content Negotiation in HTTP"

rfc2616.txt
	http/1.1

rfc2617.txt
	"HTTP Authentication: Basic and Digest Access Authentication"

rfc2818.txt
	"HTTP Over TLS"

rfc2964.txt
	cookies

rfc2965.txt
	cookies

rfc3143.txt
	"Known HTTP Proxy/Caching Problems"

rfc3205.txt
	"On the use of HTTP as a Substrate"

rfc3230.txt
	"Instance Digests in HTTP"

rfc4229.txt
	"HTTP Header Field Registrations"


# on uris/urls

rfc1630.txt
	"Universal Resource Identifiers in WWW"

rfc3305.txt
	uri/url/urn

rfc3986.txt
	uri syntax


# to read

ftp://ftp.rfc-editor.org/in-notes/rfc2660.txt
ftp://ftp.rfc-editor.org/in-notes/rfc2817.txt
ftp://ftp.rfc-editor.org/in-notes/rfc2936.txt
ftp://ftp.rfc-editor.org/in-notes/rfc3229.txt

Added doc/shttpd-testing.txt.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# start shttpd for testing

emu -c0
repo=src/shttpd
bind '#U*/home' /usr; bind -b '#s' /chan; ndb/cs; ndb/dns -r; cd; home=`{pwd}; cd $home/$repo/appl/cmd/ip; sblpath=(/dis .)
bind -a $home/$repo $home/$repo/doc/testroot/localhost:8000
bind -a $home/$repo/man $home/$repo/doc/testroot/_default:8000
./shttpd -n $home/$repo/doc/ndb-testshttpd $home/$repo/doc/testroot


emu -c0
repo=src/scgid
bind '#U*/home' /usr; ndb/cs; cd; home=`{pwd}; cd $home/$repo/appl/cmd; sblpath=(/dis .)
./scgid ../../doc/scgid.conf	# has handler on net!localhost!4006

cmd='telnet localhost 8000'
cmd2='telnet localhost 8001'

# plain file, http/1.0 and http/1.1

$cmd
GET /README HTTP/1.0
Host: localhost:8000
Connection: close

$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close


# dir listing

# succesful, http/1.1
$cmd
GET /appl/ HTTP/1.1
Host: localhost:8000
Connection: close

# with missing trailing slash
# * errror 404
$cmd
GET /appl HTTP/1.1
Host: localhost:8000
Connection: close

# http/1.0
$cmd
GET /appl/ HTTP/1.0
Host: localhost:8000
Connection: close


# index file serving

# index.txt
$cmd
GET /dir0/ HTTP/1.1
Host: localhost:8000
Connection: close

# index.html (not index.txt due to config order)
$cmd
GET /dir1/ HTTP/1.1
Host: localhost:8000
Connection: close

# no index file present
# * serves directory listing
$cmd
GET /dir2/ HTTP/1.1
Host: localhost:8000
Connection: close


# redirections

# absolute redir
$cmd
GET /redir1 HTTP/1.1
Host: localhost:8000
Connection: close

# relative redir
$cmd
GET /redir2 HTTP/1.1
Host: localhost:8000
Connection: close

# redir configured with bad groups
# * internal server error
$cmd
GET /redir4 HTTP/1.1
Host: localhost:8000
Connection: close

# redir with two escaped $'s in destination
$cmd
GET /redir5 HTTP/1.1
Host: localhost:8000
Connection: close



# mime type detection
#	built-in
#	user
#	user overrides

# no extension -> text/plain
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close

# unknown extension -> application/octet-stream
$cmd | sed '/^$/q'
GET /appl/cmd/ip/shttpd.sbl HTTP/1.1
Host: localhost:8000
Connection: close

# known extension
$cmd | sed '/^$/q'
GET /appl/cmd/ip/shttpd.b HTTP/1.1
Host: localhost:8000
Connection: close

# user-specified: .dis -> application/x-dis
$cmd | sed '/^$/q'
GET /appl/cmd/ip/shttpd.dis HTTP/1.1
Host: localhost:8000
Connection: close

# user overriding built-in: .jpg -> testing/jpg
$cmd | sed '/^$/q'
GET /testing.jpg HTTP/1.1
Host: localhost:8000
Connection: close



# authorization
#	where required
#	where not allowed
#	with empty user/pass

# empty credentials where none are allowed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Basic Og==

# non-empty credentials where none are allowed (for sanity)
# * error unauthorized
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=

# empty credentials where required
# * error unauthorized
$cmd
GET /auth0 HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Basic Og==

# incorrect credentials where required
# * error unauthorized
$cmd
GET /auth0 HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Basic YmFkOmJhZA==

# missing credentials where required
# * error unauthorized
$cmd
GET /auth0 HTTP/1.1
Host: localhost:8000
Connection: close

# malformed credentials where required
# * error unauthorized
$cmd
GET /auth0 HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Digest test test

# correct credentials where required
$cmd
GET /auth0 HTTP/1.1
Host: localhost:8000
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=

# correct credentials on http/1.0
$cmd
GET /auth0 HTTP/1.0
Host: localhost:8000
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=



# caching responses

# for plain file
$cmd | sed '/^$/q'
GET /README HTTP/1.1
Host: localhost:8000
Connection: close

# for dir listing
$cmd
GET /dir2/ HTTP/1.1
Host: localhost:8000
Connection: close


# range requests
#	invalid ranges
#	valid
#	plain files, directory

# first three bytes
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close

# valid, random spaces
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0 -2  
Connection: close

# valid, random spaces
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0- 2
Connection: close

# valid, random whitespace
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0	          - 2
Connection: close

# multipart/byteranges, with many different whitespace and different forms
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = -3, 1-, 0 - 2, 3-4, 5- 9, 10 -11100000000000000
Connection: close

# multipart/byteranges, with empty lists
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2,,,4-5
Connection: close

# bad range value, ignored
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = test
Connection: close

# bad range value, ignored
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 10
Connection: close

# ignored for http/1.0, returns full object
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Range: bytes = 0-2
Connection: close



# headers
#	date
#	last-modified
#	etag (plain files, directory listings)
#	server

# do twice, check that last-modified,etag,server are same;  date is different
$cmd | sed '/^$/q'
GET /README HTTP/1.0
Host: localhost:8000
Connection: close



# conditional responses
#	if-modified-since
#	if-unmodified-since
#	if-match
#	if-none-match
#	if-range
#	http/1.0 only does if-unmodified-since, nothing else

# if modified long in past, returns new object
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-modified-since: Thu, 1  Jan 1970 01:00:01 GMT

# if modified far in future
# * error 304 precondition failed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-modified-since: Mon, 18 Jan 2020 10:01:52 GMT

# http/1.0 head must ignore the if-modified-since...
$cmd 
HEAD /README HTTP/1.0
Host: localhost:8000
if-modified-since: Mon, 18 Jan 2020 10:01:52 GMT

# if unmodified since long past
# * error 304 precondition failed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-unmodified-since: Thu, 1  Jan 1970 01:00:01 GMT

# if unmodified since far future, will return object
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-unmodified-since: Mon, 18 Jan 2020 10:01:52 GMT

# if-match *, if it exists.  returns object
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-match: *

# NOTE: etag for README is "9207a52c44a572f6f8f36947216d395c6d05984a", replace by current for testing
# if-match correct-tag, returns object
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-match: "9207a52c44a572f6f8f36947216d395c6d05984a"

# incorrect tag, 412 precondition failed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-match: "flierp"

# correct tag, but as weak
# * error 412 precondition failed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-match: W/"9207a52c44a572f6f8f36947216d395c6d05984a"

# bad syntax for if-match
# * error 412 precondition failed
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-match: bad syntax

# if-none-match *, if no such file
# * error 304 not modified
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: *

# if-none-match correct tag
# * error 304 not modified
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-none-match on non-existent file
# * error 404 object not found
$cmd
GET /nosuchfile HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-none-match, bogus tag, returns file
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: "bogustag"

# if-none-match, bad syntax, returns file
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: bad syntax

# if-range with matching etag, returns partial response
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-1
Connection: close
If-Range: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-range with bad syntax for range, returns full response
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = bad syntax
Connection: close
If-Range: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-range with non-matching etag, returns full body
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
If-Range: "flierp"

# if-range with time in past, returns full body
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
if-range: Thu, 1  Jan 1970 01:00:01 GMT

# if-range with time in future, returns 206 partial content
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
if-range: Mon, 18 Jan 2020 10:01:52 GMT

# now for some http/1.0 conditional requests

# if modified since far in future, only conditional http/1.0 supports
# * error 304
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Connection: close
if-modified-since: Mon, 18 Jan 2020 10:01:52 GMT

# if unmodified since long past, 304 for http/1.1, http/1.0 ignores it
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Connection: close
if-unmodified-since: Thu, 1  Jan 1970 01:00:01 GMT

# if-match, incorrect tag, 412 precondition failed for http/1.1, http/1.0 ignores it
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Connection: close
if-match: "flierp"

# if-none-match *, if no such file.  304 for http/1.1, ignored for http/1.0
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Connection: close
if-none-match: *

# if-range with matching etag, returns partial response for http/1.1, ignored for http/1.0
$cmd
GET /README HTTP/1.0
Host: localhost:8000
Range: bytes = 0-1
Connection: close
If-Range: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-range with bad syntax for range, returns full response
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = bad syntax
Connection: close
If-Range: "9207a52c44a572f6f8f36947216d395c6d05984a"

# if-range with non-matching etag, returns full body
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
If-Range: "flierp"

# if-range with time in past, returns full body
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
if-range: Thu, 1  Jan 1970 01:00:01 GMT

# if-range with time in future, returns 206 partial content
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Range: bytes = 0-2
Connection: close
if-range: Mon, 18 Jan 2020 10:01:52 GMT

# test parsing of escaped double-quote.  should recognize the latter valid tag
# * 304
$cmd
GET /README HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: "double-quote \"escape\"", "67445287edaed679f8b2ce102e827815ad17d46f"


# config, alias

# config, default alias (unknown hostname)
$cmd
GET / HTTP/1.1
Host: 127.0.0.1:8000
Connection: close

# serves files just like localhost:8000
$cmd
GET /README HTTP/1.1
Host: localhost.local:8000
Connection: close

# bogus host (_default:port) does not have /README
# * error 404
$cmd
GET /README HTTP/1.1
Host: bogus:8000
Connection: close


# virtual hosts

# change vhost to nohost and reload config.  returns listing of hostdirs
$cmd
GET / HTTP/1.1
Host: bogus
Connection: close

# same, specifying a valid host has no effect
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close

# enable vhosts again, reload config

# known host:port
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close

# known host, but missing port in host-header.  still returns valid data since we connected to right address
$cmd
GET / HTTP/1.1
Host: localhost
Connection: close

# known host, missing port, connect to other ip where we are not allowed for this host
# * error 404 object not found
$cmd2
GET /README HTTP/1.1
Host: localhost
Connection: close


# known host, correctport, connect to other ip where we are not allowed for this host
# * error 404 object not found
$cmd2
GET /README HTTP/1.1
Host: localhost:8000
Connection: close

# connect using ip as hostname, not configured
# * error 404
$cmd
GET /README HTTP/1.1
Host: 127.0.0.1:8000
Connection: close

# connect using ip as hostname, configured, returns file
$cmd
GET /README HTTP/1.1
Host: 127.0.0.2:8000
Connection: close

# try ip6, for fun
$cmd
GET /README HTTP/1.1
Host: [::1]:8000
Connection: close

# bogus ip6-like
# * error 400
$cmd
GET /README HTTP/1.1
Host: [::1
Connection: close

# bogus ip6-like
# * error 404
$cmd
GET /README HTTP/1.1
Host: ::1
Connection: close

# bogus, should not succeed
# * 404
$cmd
GET /README HTTP/1.1
Host: [localhost]:8000
Connection: close

# default config
# ./shttpd -n /dev/null -d -a 'net!*!8000' $home/$repo/doc/testroot

# should return normal response
$cmd
GET /_default:8000 HTTP/1.1
Host: localhost:8000
Connection: close


# ctl chan: reload config
# verify whether it works
echo reload >/chan/shttpd

# make change that breaks config, after reload it should keep config and still work
echo reload >/chan/shttpd


# command-line options: overrides config/ignored

# start simple shttpd:
# ./shttpd $home/$repo/doc/testroot

# request succeeds!
$cmd
GET /localhost:8000/README HTTP/1.1
Host: bogus
Connection: close


# start shttpd with config and with conflicting options, before and after loading config
# ./shttpd -h -d -a 'net!*!8001' -C 10 -f blah -i index.txt -i index.html -l /dev/null -r '^/redir0' /redir1 -s /scgi net!localhost!1234 '' -c /cgi '{echo blah}' '' -t .txt test/flierp -n /dev/null -a 'net!*!8000' $home/$repo/doc/testroot

# now, all those options should be off except -f, and we should be listening on port 8000 now.

# normal get should work, should not do caching
$cmd
GET /localhost:8000/README HTTP/1.1
Host: bogus
Connection: close

# should refuse connection
$cmd2

# directory listings not configured
# * error 404
$cmd
GET /localhost:8000/ HTTP/1.1
Host: bogus
Connection: close

# no index file serving and no listings
# * error 404
$cmd
GET /_default:8000/ HTTP/1.1
Host: bogus
Connection: close


# this time, these options should still be used
# ./shttpd  -n /dev/null -d -C 10 -f blah -i index.txt -i index.html -l /dev/null -r '^/redir0' /redir1 -s /scgi net!localhost!1234 '' -c /cgi '{echo blah}' '' -t .txt test/flierp -a 'net!*!8000' $home/$repo/doc/testroot

# returns listing of testroot
$cmd
GET / HTTP/1.1
Host: 
Connection: close



# old http version, should return 505 http version not supported (or perhaps something else)
# * error 505
$cmd
GET / HTTP/0.9
Host: bogus
Connection: close

# new minor http version, should work as http/1.1
$cmd
GET /README HTTP/1.2
Host: localhost:8000
Connection: close

# new major http version, should send 505
# * error 505
$cmd
GET / HTTP/2.123
Host: localhost:8000
Connection: close

# other methods

# options.  this returns a page with "200 - OK" on it, fine by us
$cmd
OPTIONS * HTTP/1.1
Host: localhost:8000
Connection: close

# options, host header must still be present, though it is not used
$cmd
OPTIONS * HTTP/1.1
Connection: close

# options does not exist in http/1.0
# * error 501
$cmd
OPTIONS * HTTP/1.0
Connection: close

# trace.  this returns the request as message/http.  note that it changes the * to a /
$cmd
TRACE * HTTP/1.1
Host: localhost:8000
Connection: close
X-Try: me

# http/1.0 did not know trace
# * error 501
$cmd
TRACE * HTTP/1.0
Host: localhost:8000
Connection: close
X-Try: me

# connect, not supported, obviously
# * error 501
$cmd
CONNECT * HTTP/1.1
Host: localhost:8000
Connection: close

# put not implemented
# * error 501
$cmd
PUT / HTTP/1.1
Host: localhost:8000
Connection: close

# delete not implemented
# * error 501
$cmd
DELETE / HTTP/1.1
Host: localhost:8000
Connection: close

# put not known in http/1.0
$cmd
PUT / HTTP/1.0
Host: localhost:8000
Connection: close

# delete not knowni n http/1.0
$cmd
DELETE / HTTP/1.1
Host: localhost:8000
Connection: close

# keepalive connections, closes after third request, since keepalive is onl for http/1.1
$cmd
GET / HTTP/1.1
Host: localhost:8000

GET /README HTTP/1.1
Host: localhost:8000

GET / HTTP/1.0
Host: localhost:8000



# invalid request

# missing http version
# * 400 bad request
$cmd
GET / 

# nothing after path
# * 400 bad request
$cmd
GET /

# missing path and version
# * 400 bad request
$cmd
GET 

# nothing after method
# * 400 bad request
$cmd
GET

# missing path
# * 400 bad request
$cmd
GET HTTP/1.1

# empty path, invalid
# * 400
$cmd
GET  HTTP/1.1
Host: localhost:8000
Connection: close

# unknown method
# * 501 not implemented
$cmd
TEST / HTTP/1.1

# lower case, invalid
# * 501 not implemented
$cmd
get / HTTP/1.1

# lower case version
# * 400 bad request
$cmd
GET / http/1.1

# normal head
$cmd
HEAD / HTTP/1.1
Host: localhost:8000
Connection: close


# trikcy headers

# continuation header on first line of headers
# * 400
$cmd
GET / HTTP/1.1
 continuation: on first line


# missing value for header
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
badheader

# invalidly duplicate headers
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
Host: localhost:8000
Connection: close

# multiple connections is valid, all unknown values should be treated as header-names
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close
Connection: test

# duplicate
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close
if-match: "a"
if-match: "b"

# duplicate
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close
if-none-match: "a"
if-none-match: "b"

# duplicate
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close
authorization: Basic "test"
authorization: Basic "test"

# note: there are a few more headers that cannot be specified twice

# we are not a proxy, we don't want random credentials sent to us
# * 400
$cmd
GET / HTTP/1.1
Host: localhost:8000
Connection: close
proxy-authorization: Basic "test"

# header continuations
$cmd
GET / HTTP/1.1
Host:
 localhost:8000                  
Connection: test, test2 ,,test4            ,
  ,test5
	,close
X-Test: yes



# cgi

# get with query string.  has valid QUERY_STRING, etc.
$cmd
GET /cgi0?q=test HTTP/1.1
Connection: close
Host: localhost:8000

# and with keep-alive
$cmd
GET /cgi0?q=test HTTP/1.1
Host: localhost:8000

# http/1.0 does not send content-length and closes connection
$cmd
GET /cgi0?q=test HTTP/1.0
Host: localhost:8000

# post without content-length
# * 411
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
Connection: close

# post without content-length on http/1.0 causes "bad request"
# * 400
$cmd
POST /cgi0?q=test HTTP/1.0
Host: localhost:8000

# identity is default, and only supported
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
transfer-encoding: identity
content-length: 0
connection: close

# chunked transfer-encoding not allowed from client
# * 501 not implemented
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
transfer-encoding: chunked
content-length: 0
connection: close

# transfer-encoding  is valid, but obscure, so we don't allow it (fix?)
# * 501 not implemented
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
transfer-encoding: identity, identity
content-length: 0
connection: close

# identity content-encoding is the default
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-encoding: identity
content-length: 0
connection: close

# this content-encoding is valid, but obscure, so we don't allow it (fix?)
# * 501 not implemented
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-encoding: identity, identity
content-length: 0
connection: close

# no compressed incoming data
# * 501 not implemented
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-encoding: gzip
content-length: 0
connection: close

# unparsable content-length
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-length: test
connection: close


# 100-continue expect header, generated by server
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-length: 0
connection: close
expect: 100-continue

# unknown expect header
# * 417
$cmd
POST /cgi0?q=test HTTP/1.1
Host: localhost:8000
content-length: 0
connection: close
expect: test

# ignore expect for http/1.0, so valid
$cmd
POST /cgi0?q=test HTTP/1.0
Host: localhost:8000
content-length: 0
connection: close
expect: test

# cgi script is broken, no status:-line
# * 500
$cmd
POST /cgi1 HTTP/1.1
Host: localhost:8000
content-length: 0
connection: close

# cgi script is broken, sends 100-continue and then nothing
# * 500
$cmd
POST /cgi2 HTTP/1.1
Host: localhost:8000
connection: close
content-length: 0

# cgi script sends 100-continue, not webserver.  we don't require one
$cmd
POST /cgi3 HTTP/1.1
Host: localhost:8000
connection: close
content-length: 0

# cgi script sends 100-continue, not webserver.  we do require one.
$cmd
POST /cgi3 HTTP/1.1
Host: localhost:8000
connection: close
content-length: 0
expect: 100-continue 

# broken cgi script, it returns a bad content-length
# * 500
$cmd
GET /cgi4 HTTP/1.1
Host: localhost:8000
connection: close
content-length: 0

# cgi script which sets content-length
$cmd
GET /cgi5 HTTP/1.1
Host: localhost:8000
connection: close
content-length: 0

# cgi script which sets shorter content-length than it sends data
# responds with okay, but closes connection before sending data.  this allows the client to detect the error
$cmd
GET /cgi6 HTTP/1.1
Host: localhost:8000
connection: close

# even for http/1.0!
$cmd
GET /cgi6 HTTP/1.0
Host: localhost:8000
connection: close

# cgi script which sets longer content-length than it sends data
# responds with okay, but closes connection before sending data.  this allows the client to detect the error
$cmd
GET /cgi7 HTTP/1.1
Host: localhost:8000
connection: close

# same for http/1.0
$cmd
GET /cgi7 HTTP/1.0
Host: localhost:8000
connection: close




# since scgi handling is practically indentical to cgi handling, we don't do as many tests
$cmd
GET /scgi0 HTTP/1.0
Host: localhost:8000
connection: close

# scgi handler that is unreachable
$cmd
GET /scgi1 HTTP/1.0
Host: localhost:8000
connection: close

# cgi with incoming data, which is ignored by server
# on incoming data, the connection is always closed afterwards
$cmd
POST /cgi0 HTTP/1.1
Host: localhost:8000
content-length: 2

a

# test method that is explicitly allowed
$cmd
GET /cgi8 HTTP/1.1
Host: localhost:8000
Connection: close

# test method that is not allowed
# * 405
$cmd
POST /cgi8 HTTP/1.1
Host: localhost:8000
Connection: close
content-length: 0

# xxx returns 404, returning 403 at all the right times is hard when doing directory listings
# test for permission denied
# * 403
$cmd
GET /test.txt HTTP/1.1
Host: localhost:8000
Connection: close

Added doc/testroot/_default!8000/index.txt.


1
+
index.txt

Added doc/testroot/localhost!8000/auth0.


1
+
auth0

Added doc/testroot/localhost!8000/dir0/index.txt.


1
+
index.txt

Added doc/testroot/localhost!8000/dir1/index.html.


1
+
index.html

Added doc/testroot/localhost!8000/dir1/index.txt.


1
+
index.txt

Added doc/testroot/localhost!8000/testing.jpg.

Added fonts/BQN386/10/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/10/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/10/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/10a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         17          13
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/11/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/11/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         17          13
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/11a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         19          15
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/12/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/12/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         19          15
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/12a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/13/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/13/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/13a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         22          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/14/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/14/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         22          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/14a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         24          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/15/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/15/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         24          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/15a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/16/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/16/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/16a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          21
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/17/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/17/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          21
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/17a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         28          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/18/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/18/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         28          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/18a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         30          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/19/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/19/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         30          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/19a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/20/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/20/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/20a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         34          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/22/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/22/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         34          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/22a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/24/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/24/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/24a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         44          35
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/28/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/28/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         44          35
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/28a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          7           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/4/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/4/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          7           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/4a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           6
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/5/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/5/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           6
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/5a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/6/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/6/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/6a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         11           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/7/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/7/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         11           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/7a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         13          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/8/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/8/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         13          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/8a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/9/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/9/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/font.




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000180 0x00019f x000180.bit
0x0001a0 0x0001bf x0001a0.bit
0x0001c0 0x0001df x0001c0.bit
0x0001e0 0x0001ff x0001e0.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x000240 0x00025f x000240.bit
0x000260 0x00027f x000260.bit
0x000280 0x00029f x000280.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000360 0x00037f x000360.bit
0x000380 0x00039f x000380.bit
0x0003a0 0x0003bf x0003a0.bit
0x0003c0 0x0003df x0003c0.bit
0x0003e0 0x0003ff x0003e0.bit
0x000400 0x00041f x000400.bit
0x000420 0x00043f x000420.bit
0x000440 0x00045f x000440.bit
0x001420 0x00143f x001420.bit
0x001440 0x00145f x001440.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x002040 0x00205f x002040.bit
0x002060 0x00207f x002060.bit
0x002080 0x00209f x002080.bit
0x0020a0 0x0020bf x0020a0.bit
0x002100 0x00211f x002100.bit
0x002120 0x00213f x002120.bit
0x002180 0x00219f x002180.bit
0x0021a0 0x0021bf x0021a0.bit
0x0021c0 0x0021df x0021c0.bit
0x0021e0 0x0021ff x0021e0.bit
0x002200 0x00221f x002200.bit
0x002220 0x00223f x002220.bit
0x002240 0x00225f x002240.bit
0x002260 0x00227f x002260.bit
0x002280 0x00229f x002280.bit
0x0022a0 0x0022bf x0022a0.bit
0x0022c0 0x0022df x0022c0.bit
0x002300 0x00231f x002300.bit
0x002320 0x00233f x002320.bit
0x002340 0x00235f x002340.bit
0x002360 0x00237f x002360.bit
0x002380 0x00239f x002380.bit
0x0023a0 0x0023bf x0023a0.bit
0x0023c0 0x0023df x0023c0.bit
0x002400 0x00241f x002400.bit
0x0024a0 0x0024bf x0024a0.bit
0x0024c0 0x0024df x0024c0.bit
0x0024e0 0x0024ff x0024e0.bit
0x002500 0x00251f x002500.bit
0x002520 0x00253f x002520.bit
0x002540 0x00255f x002540.bit
0x002560 0x00257f x002560.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x002640 0x00265f x002640.bit
0x002660 0x00267f x002660.bit
0x002680 0x00269f x002680.bit
0x0027c0 0x0027df x0027c0.bit
0x0027e0 0x0027ff x0027e0.bit
0x002940 0x00295f x002940.bit
0x002980 0x00299f x002980.bit
0x0029e0 0x0029ff x0029e0.bit
0x002b20 0x002b3f x002b20.bit
0x01d520 0x01d53f x01d520.bit
0x01d540 0x01d55f x01d540.bit
0x01d560 0x01d57f x01d560.bit

Added fonts/BQN386/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000180.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0001a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0001c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0001e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000240.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000260.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000280.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000360.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000380.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0003a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0003c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0003e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000400.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000420.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x000440.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x001420.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x001440.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002040.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002060.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002080.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002100.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002120.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002180.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0021a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0021c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0021e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002220.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002240.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002260.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002280.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0022a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0022c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002300.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002320.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002340.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002360.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002380.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0023a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0023c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002400.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0024a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0024c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0024e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002500.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002520.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002540.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002560.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002640.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002660.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002680.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0027c0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0027e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002940.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002980.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x0029e0.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x002b20.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x01d520.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x01d540.bit.

cannot compute difference between binary files

Added fonts/BQN386/9a/x01d560.bit.

cannot compute difference between binary files

Added fonts/BQN386/LICENSE.

























1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <https://unlicense.org>

Added fonts/hermit/LICENSE.































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Copyright (c) 2013, Pablo Caro <me AT pcaro DOT es> - http://pcaro.es/
with Reserved Font Name Hermit.

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Added fonts/hermit/bold/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bold/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bold/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/bolditalic/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/bolditalic/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/light/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/light/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/lightitalic/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/lightitalic/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regular/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regular/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/10/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         20          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/10a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/10a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/11/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         21          14
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/11a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/11a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/12/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         23          16
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/12a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/12a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/13/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         25          17
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/13a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/13a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/14/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         27          19
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/14a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/14a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/15/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         29          20
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/15a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/15a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/16/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         31          22
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/16a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/16a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/17/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         33          23
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/17a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/17a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/18/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         35          24
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/18a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/18a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/19/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         37          26
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/19a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/19a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/20/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         39          27
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/20a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/20a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/22/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         42          29
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/22a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/22a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/24/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         46          32
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/24a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/24a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/28/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         54          38
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/28a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/28a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/4/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
          8           5
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/4a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/4a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/5/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         10           7
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/5a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/5a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/6/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         12           8
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/6a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/6a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/7/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         14          10
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/7a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/7a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/8/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         16          11
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/8a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/8a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/9/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/font.































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         18          12
0x000000 0x00001f x000000.bit
0x000020 0x00003f x000020.bit
0x000040 0x00005f x000040.bit
0x000060 0x00007f x000060.bit
0x0000a0 0x0000bf x0000a0.bit
0x0000c0 0x0000df x0000c0.bit
0x0000e0 0x0000ff x0000e0.bit
0x000100 0x00011f x000100.bit
0x000120 0x00013f x000120.bit
0x000140 0x00015f x000140.bit
0x000160 0x00017f x000160.bit
0x000200 0x00021f x000200.bit
0x000220 0x00023f x000220.bit
0x0002c0 0x0002df x0002c0.bit
0x000300 0x00031f x000300.bit
0x000320 0x00033f x000320.bit
0x001e80 0x001e9f x001e80.bit
0x001ee0 0x001eff x001ee0.bit
0x002000 0x00201f x002000.bit
0x002020 0x00203f x002020.bit
0x0020a0 0x0020bf x0020a0.bit
0x002200 0x00221f x002200.bit
0x002580 0x00259f x002580.bit
0x0025a0 0x0025bf x0025a0.bit
0x0025c0 0x0025df x0025c0.bit
0x0025e0 0x0025ff x0025e0.bit
0x0026a0 0x0026bf x0026a0.bit
0x002700 0x00271f x002700.bit
0x00e0a0 0x00e0bf x00e0a0.bit

Added fonts/hermit/regularitalic/9a/x000000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000040.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000060.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0000a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0000c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0000e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000100.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000120.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000140.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000160.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000220.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0002c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000300.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x000320.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x001e80.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x001ee0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x002000.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x002020.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0020a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x002200.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x002580.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0025a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0025c0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0025e0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x0026a0.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x002700.bit.

cannot compute difference between binary files

Added fonts/hermit/regularitalic/9a/x00e0a0.bit.

cannot compute difference between binary files

Added fonts/ttf/README.













1
2
3
4
5
6
7
8
9
10
11
12
+
+
+
+
+
+
+
+
+
+
+
+
# ttf fonts

original sources for system fonts and big fonts that are more efficient to use
via font server.

## noto

tomo el fuego is designed to be accessible to all cultures. we use noto to help
facilitate that goal! the collection is very large, but it is important to have
native support for all forms of human expression via text. we recognize that
unicode does not yet provide support for many languages including maya.

Added fonts/ttf/noto/LICENSE.































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Copyright 2018 The Noto Project Authors (github.com/googlei18n/noto-fonts)

This Font Software is licensed under the SIL Open Font License,
Version 1.1.

This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL

-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to
provide a free and open framework in which fonts may be shared and
improved in partnership with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software
components as distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed,
modify, redistribute, and sell modified and unmodified copies of the
Font Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created using
the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Changes to lib/emptydirs.


1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
+







acme/mail
AIX/power/lib
FreeBSD/386/lib
Inferno/386/bin
Inferno/386/lib
Inferno/arm/bin
Inferno/arm/lib
Inferno/mips/bin

Changes to lib/limbo.vim.

1
2
3
4




5

6
7
8
9
10
11
12
13
14
15
16
17



18

19




20
21
22
23








24


25

26

27






28
29










30


31
32
33
34
35
36
37
















38
39
40



41
42
43

44
45

46
47
48
49
50
51
52
53
54
55



56
57
58
59



60



61
62
63



64
65
66






67
68
69
70
71
72





73
74
75
76
77




78
79
80
81



82
83
84
85
86




87
88
89
90
91
92
1



2
3
4
5

6
7


8
9
10
11
12
13


14
15
16
17

18
19
20
21
22
23




24
25
26
27
28
29
30
31

32
33
34
35

36
37
38
39
40
41
42
43


44
45
46
47
48
49
50
51
52
53
54
55
56







57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73


74
75
76
77
78

79
80

81
82
83
84
85
86


87


88
89
90
91



92
93
94
95
96
97
98



99
100
101
102


103
104
105
106
107
108
109





110
111
112
113
114





115
116
117
118




119
120
121





122
123
124
125
126
127
128

129
130

-
-
-
+
+
+
+
-
+

-
-






-
-

+
+
+
-
+

+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
-
+
+

+
-
+

+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+

+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+
+


-
+

-
+





-
-

-
-
+
+
+

-
-
-
+
+
+

+
+
+
-
-
-
+
+
+

-
-
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+



-


" Vim syntax file
" Language:     Limbo
" Maintainer:   Alex Efros <powerman-asdf@ya.ru>
" Version:	0.5
" Language:	Limbo
" Maintainer:	Alex Efros <powerman-asdf@ya.ru>
" URL:		http://powerman.name/download/vim/syntax/limbo.vim
" Version:	1.0
" Updated:      2008-10-17
" Last Change:	2012-12-11

" Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file
" was already loaded (6.x).
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

syn keyword	lTodo		TODO TBD FIXME XXX BUG contained
syn match	lComment	"#.*" contains=@Spell,lTodo

" comment
syn match limboComment		"#.*" contains=limboTodo,limboLineFile,@Spell extend
syn match limboLineFile		contained /#\@<=line\s\+\d\+\s\+"[^"]\+"$/
syn keyword	lInclude	include
syn keyword limboTodo		contained TODO TBD FIXME XXX NOTE BUG WARNING DEBUG OPTIMIZATION WORKAROUND

" constant
syn region limboStringSimple	keepend extend start=+`+ end=+`+ contains=@Spell
syn region limboStringQuoted	keepend extend start=+"+ skip=+\\[\\"]+ end=+"+ contains=limboEscapedChar,limboErrorEscaped,limboErrorMultiline,@Spell
syn region limboChar		keepend extend start=+'+ skip=+\\[\\']+ end=+'+ contains=limboEscapedChar,limboErrorEscaped,limboErrorMultiline,limboErrorChar
syn match	lSpecialChar	display contained "\\\(u\x\{4}\|['\"\\tnrbavf0]\)"
syn match	lSpecialError	display contained "\(\\[^'\"\\tnrbavf0u]\+\|\\u.\{0,3}\X\)"
syn match	lCharError	display contained "\([^\\'][^']\+\|\\[^'][^']\+\)"
syn region	lString		start=+"+ end=+"+ skip=+\\"+ contains=@Spell,lSpecialChar,lSpecialError
syn match limboEscapedChar	contained "\\\%(u\x\{4}\|[\\'"abtnvfr0]\)"
syn match limboErrorEscaped	contained "\\\%(u.\{0,3}\_X\|\_[^u\\'"abtnvfr0]\)"
syn match limboErrorMultiline	contained "\n\@<=.\+"
syn match limboErrorChar	contained "'\zs'"
syn match limboErrorChar	contained "'\zs\%(\%([^\\]\|\\u\x\{4}\|\\[\\'"abtnvfr0]\)'\)\@!.\+"
syn match limboNumber		"\w\@<!\d\+\(r[0-9A-Za-z]\+\)\?\w\@!"
syn match limboFloat		"\w\@<!\(\d\+[.eE]\@=\(\.\d*\)\?\|\.\d\+\)\([eE][+-]\?\d\+\)\?\w\@!"

syn region	lCharacter	start=+'+ end=+'+ skip=+\\'+ contains=lSpecialChar,lSpecialError,lCharError
" function
syn match limboFunction		"\w\@<!\h\w*\(\(\s*\[\s*\h\w*\(\s*,\s*\h\w*\)*\s*\]\)\?\s*(\)\@="

" delimiter (lower priority over operator)
syn keyword	lSpecial	nil iota
syn match limboDelimiterDecl	":"

" operator
syn match limboOperator		"\([+*/%&|^-]\|\*\*\|<<\|>>\)=\@!"
syn match limboOperatorAssign	"\([+*/%&|^-]\|\*\*\|<<\|>>\)="
syn match limboOperatorAssign	"=\|:="
syn match limboOperator		"++\|--\|[!~]\|&&\|||"
syn match limboOperator		"[=!]=\|[<>]=\?"
syn keyword	lFunction	tl hd len tagof
syn match	lFunction	"<-=\?"
syn match limboOperatorCons	"::"
syn match limboOperatorIO	"<-"

" delimiter
syn match limboDelimiter	"[;{}[\],]"
syn match limboDelimiterGroup	"[()]"
syn match limboDelimiterIdent	"\.\|->"
syn keyword limboDelimiterQual	or to
syn match limboDelimiterQual	"\*\(\_s*=>\)\@="
syn match limboDelimiterQual	"=>"

" label
syn match limboLabel		"^\s*\h\w*:\_s*\(\(for\|while\|do\|case\|alt\|pick\)\>\)\@="
syn keyword	lStatement	alt break continue exit return spawn implement import load raise
syn keyword 	lRepeat		for while do
syn keyword	lConditional	if else case 

syn keyword	lType		array big byte chan con int list real string fn fixed
syn keyword	lStructure	adt pick module
syn keyword	lStorageClass	ref self cyclic type of

" keyword
syn keyword limboConditional	if else case alt pick
syn keyword limboRepeat		do while break continue
syn match limboRepeat		"\<for\>"
syn keyword limboOperator	len hd tl tagof ref load return spawn exit
syn keyword limboKeyword	implement import con dynamic 
syn match limboKeywordPoly	"\<for\(\s*{\)\@="
syn keyword limboException	exception raise raises
syn keyword limboInclude	include
syn keyword limboType		byte big int real string fn chan array list of
syn match limboType		"\<fixed([^),]\+\(,[^),]\+\)\?)"
syn keyword limboStorageClass	cyclic self
syn keyword limboStructure	adt module
syn keyword limboTypedef	type
syn keyword limboSpecial	nil iota

syn keyword	lDelimiter	or to
syn match	lDelimiter	"=>\|->\|\.\|::"

syn sync fromstart
syn sync linebreaks=1


if version >= 508 || !exists("did_icgiperl_syn_inits")
if version >= 508 || !exists("did_limbo_syn_inits")
  if version < 508
    let did_icgiperl_syn_inits = 1
    let did_limbo_syn_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

    " Comment
    HiLink lComment         Comment

    " PreProc (Include, PreCondit)
    HiLink lInclude         Include
  HiLink limboComment		Comment
  HiLink limboLineFile		SpecialComment
  HiLink limboTodo		Todo

    " Constant (String, Character, Number, Boolean, Float)
    HiLink lString          String
    HiLink lCharacter       Character
  HiLink limboErrorEscaped	Error
  HiLink limboErrorMultiline	Error
  HiLink limboErrorChar		Error

  HiLink limboStringSimple	String
  HiLink limboStringQuoted	String
  HiLink limboChar		Character
    " Special (Tag, SpecialChar, SpecialComment, Debug)
    HiLink lSpecial	    Special
    HiLink lSpecialChar     SpecialChar
  HiLink limboEscapedChar	SpecialChar
  HiLink limboNumber		Number
  HiLink limboFloat		Float

    " Identifier (Function)
    HiLink lFunction        Function
  HiLink limboFunction		Function

  HiLink limboDelimiter		Delimiter
  HiLink limboDelimiterQual	Delimiter
  HiLink limboDelimiterDecl	Delimiter
  HiLink limboDelimiterGroup	Delimiter

    " Statement (Conditional, Repeat, Label, Operator, Keyword, Exception)
    HiLink lStatement       Statement
    HiLink lRepeat          Repeat
    HiLink lConditional     Conditional

  HiLink limboConditional	Conditional
  HiLink limboRepeat		Repeat
  HiLink limboLabel		Label
  HiLink limboOperator		Operator
  HiLink limboOperatorAssign	Operator
    " Type (StorageClass, Structure, Typedef)
    HiLink lType            Type
    HiLink lStructure       Structure
    HiLink lStorageClass    StorageClass

  HiLink limboOperatorCons	Operator
  HiLink limboOperatorIO	Operator
  HiLink limboKeyword		Keyword
  HiLink limboKeywordPoly	Special
    " Error
    HiLink lSpecialError    Error
    HiLink lCharError	    Error

  HiLink limboException		Exception
  HiLink limboInclude		Include
  HiLink limboType		Type
    " Todo
    HiLink lTodo	    Todo

    " Delimiter
    HiLink lDelimiter	    Delimiter
  HiLink limboStorageClass	StorageClass
  HiLink limboStructure		Structure
  HiLink limboTypedef		Typedef
  HiLink limboSpecial		Special

  delcommand HiLink
endif


let b:current_syntax = "limbo"

Changes to lib/wmsetup.

39
40
41
42
43
44
45
46

47
48
49


50


51

52


53
54
55
56
57

58
59
60

61
62
63
64


65
66
67
68
69
70
71
39
40
41
42
43
44
45

46



47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78







-
+
-
-
-
+
+

+
+
-
+

+
+





+



+




+
+







		#	ircfs_options := (-l $home/data/irc/freenode)
		#	ircfs -d $ircfs_connect $ircfs_options freenode >/chan/wmstdout >[2=1]
		#} /mnt/irc/freenode
	}
}

plumber >/chan/wmstdout >[2=1]
menu Shell			{wmrun wm/sh}

menu Acme			{wmrun acme}
menu Edit			{wmrun wm/edit}
#menu Charon			{wmrun charon}
menu 'Web Browser'		{wmrun charon}
menu Files			{if {ftest -d $home} {wmrun wm/ftree $home} {wmrun wm/ftree /}}
menu Manual			{wmrun wm/man}
menu Amce			{wmrun acme}
#menu 
menu Files			{if {ftest -d $home} {wmrun wm/ftree $home} {wmrun wm/ftree /}}

menu ''	''

menu System			'Shell'			{wmrun wm/sh}
menu System			'Debugger'		{wmrun wm/deb}
menu System			'Module manager'	{wmrun wm/rt}
menu System			'Task manager'		{wmrun wm/task}
menu System			'Memory monitor'	{wmrun wm/memory}
menu System			'About'			{wmrun wm/about}

menu Social			'irc/tilde.chat'	{wmrun wm/irc /mnt/irc/tilde}
menu Social			'hub/9p.zone'		{wmrun wm/gridchat -g 'tcp!chat.9p.zone!9990' -n $"user}
#menu Social			'hub/heropunch.io'	{wmrun wm/gridchat -g 'tcp!chat.heropunch.io!9990' -n $"user}

menu Misc			'Coffee'		{wmrun wm/coffee}
menu Misc			'Colours'		{wmrun wm/colors}
#menu Misc			'Winctl'		{wmrun wm/winctl}
menu Misc			'Clock'			{wmrun wm/date}
menu Misc			'Notepad'		{wmrun wm/edit}

menu Games			'Tetris'		{wmrun wm/tetris}
menu Games			'Bounce'		{wmrun wm/bounce}
#menu Games			'Game client'		{wmrun games/gameclient >/dev/null >[2=1]}
#menu Games			'Game client (local)'	{wmrun games/gameclient -l > /dev/null >[2=1]}

# mount host's /home on /usr if applicable
if {test -f /env/emuroot} {

Added lib9/setfcr-FreeBSD-386.S.



































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

#define	FN(x)	.type x,@function; .global x; x
#define	ENT	subl $16, %esp
#define	RET	addl $16, %esp; ret

	.file	"setfcr-FreeBSD-386.S"
FN(setfcr):
	ENT
	xorb	$0x3f, %al
	movl	%eax, (%esp)
	fwait
	fldcw	(%esp)
	RET

FN(getfcr):
	ENT
	fwait
	fstcw	(%esp)
	movw	(%esp), %ax
	andl	$0xffff, %eax
	xorb	$0x3f, %al
	RET

FN(getfsr):
	ENT
	fwait
	fstsw	(%esp)
	movw	(%esp), %ax
	andl	$0xffff, %eax
	RET

FN(setfsr):
	fclex
	ret

Changes to libmath/FPcontrol-FreeBSD.c.

1

2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9

+







#include "lib9.h"
#include "fpuctl.h"
#include "mathi.h"

void
FPinit(void)
{
	setfsr(0);	/* Clear pending exceptions */
	setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPUNFL|FPOVFL);

Changes to libmath/dtoa.c.

1
2
3
4
5

6
7
8
9
10
11
12
1
2
3
4

5
6
7
8
9
10
11
12




-
+







/* derived from /netlib/fp/dtoa.c assuming IEEE, Standard C */
/* kudos to dmg@bell-labs.com, gripes to ehg@bell-labs.com */
#include "lib9.h"

#ifdef __APPLE__
#if defined __APPLE__ || defined __clang__
#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
#pragma clang diagnostic ignored "-Wparentheses"
#endif
#define ACQUIRE_DTOA_LOCK(n)	/*nothing*/
#define FREE_DTOA_LOCK(n)	/*nothing*/

/* let's provide reasonable defaults for usual implementation of IEEE f.p. */

Changes to locale/timezone.

1
2
3
4
5
6
7
8














9
10


11
12
13



14
15
16
17




18
19









1
2
3
4
5
6
7
8
9
10
11
12
13
14


15
16



17
18
19




20
21
22
23


24
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
+
GMT 0 BST 3600
 512528400  530672400  543978000  562122000  575427600  593571600
 606877200  625626000  638326800  657075600  670381200  688525200
 701830800  719974800  733280400  751424400  764730000  782874000
 796179600  814928400  828234000  846378000  859683600  877827600
 891133200  909277200  922582800  940726800  954032400  972781200
 985482000 1004230800 1017536400 1035680400 1048986000 1067130000
1080435600 1099184400 1111885200 1130634000 1143334800 1162083600
PST -28800 PDT -25200
   9943200   25664400   41392800   57718800   73447200   89168400
 104896800  120618000  126669600  152067600  162352800  183517200
 199245600  215571600  230695200  247021200  262749600  278470800
 294199200  309920400  325648800  341370000  357098400  372819600
 388548000  404874000  419997600  436323600  452052000  467773200
 483501600  499222800  514951200  530672400  544586400  562122000
 576036000  594176400  607485600  625626000  638935200  657075600
 670989600  688525200  702439200  719974800  733888800  752029200
 765338400  783478800  796788000  814928400  828842400  846378000
 860292000  877827600  891741600  909277200  923191200  941331600
 954640800  972781200  986090400 1004230800 1018144800 1035680400
1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
1174784400 1193533200 1206838800 1224982800 1238288400 1256432400
1269738000 1288486800 1301187600 1319936400 1332637200 1351386000
1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
1364691600 1382835600 1396141200 1414285200 1427590800 1445734800
1459040400 1477789200 1490490000 1509238800 1521939600 1540688400
1553994000 1572138000 1585443600 1603587600 1616893200 1635642000
1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
1648342800 1667091600 1679792400 1698541200 1711846800 1729990800
1743296400 1761440400 1774746000 1792890000 1806195600 1824944400
1837645200 1856394000 1869094800 1887843600 1901149200 1919293200
1932598800 1950742800 1964048400 1982797200 1995498000 2014246800
1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
2026947600 2045696400 2058397200 2077146000 2090451600 2108595600
2121901200 2140045200 2147483647
2088640800 2109204000 2120090400 2140653600

Added man/1/hexe.
















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
.TH HEXE 1
.SH NAME
hexe \- a hexdumping tool with 0% bloat
.SH SYNOPSIS
.B hexe
[
.I infile
]
[
.I outfile
]
.SH DESCRIPTION
Omitting either or using - uses stdin/stdout.
.SH SOURCE
.B /appl/cmd/hexe.b

Added man/1/xargs.

















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
.TH XARGS 1
.SH NAME
xargs \- conxargsenate files (apply cmd to args list read from stdin)
.SH SYNOPSIS
.B xargs
.I command
[
.I command args
]
<[
.I list of last command arg
]
.SH EXAMPLES
TODO
.SH SOURCE
.B /appl/cmd/xargs.b

Changes to man/8/httpd.

1
2
3


4
5

6
7
8
9
10
11
12
13
14
15
16
17
18
19


20
21
22
23
24
25


26
27

28
29
30
31



32
33
34
35
36
37
38
39
40
41
42
43
44



45
46
47

48
49
50
51
52
53







54
55
56

57
58
59
60
61
62
63







64
65
66
67
68





69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

84
85
86
87


88
89
90
91
92

93
94
95
96
97
98
99



100
101
102
103

104
105
106

107
108
109
110




111
112
113
114
115




1
2

3
4
5

6







7



8


9
10






11
12


13




14
15
16













17
18
19



20






21
22
23
24
25
26
27



28







29
30
31
32
33
34
35





36
37
38
39
40















41




42
43





44







45
46
47




48



49




50
51
52
53



54

55
56
57
58


-
+
+

-
+
-
-
-
-
-
-
-

-
-
-

-
-
+
+
-
-
-
-
-
-
+
+
-
-
+
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
+
-
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
-
-
-
-
+
-
-
-
+
-
-
-
-
+
+
+
+
-
-
-

-
+
+
+
+
.TH HTTPD 8
.SH NAME
httpd, echo, stats \- HTTP server
httpd \- HTTP server

.SH SYNOPSIS
.B svc/httpd/httpd
.B svc/httpd
[
.BI -a " addr"
] [
.BI -c " cachesize"
] [
.B -D
]
.PP
.BI svc/httpd/echo " meth vers uri search"
.PP
.BI svc/httpd/stats " meth vers uri search"
.SH DESCRIPTION
.I Httpd
is a simple HTTP daemon, serving version 1.0 of the HTTP protocol.
.I svc/httpd

It listens for incoming calls on a given
.I address
(default:
.BR tcp!*!80 ).
It serves content rooted at
.L /services/httpd/root
.SH FILES & PATHS
.TF /services/httpd/root/example.com/
in its name space.
.PP
.TP
The
.I httpd
program supports only the
.L GET
.B /services/httpd/root/_default/
default docroot
.TP
and
.L HEAD
methods of the HTTP protocol. The
.L Content-type
(default
.LR application/octet-stream )
and
.L Content-encoding
(default
.LR binary )
of a file are determined by looking for suffixes of the file name in
.BR /services/http/http.suff .
.PP
.B /services/httpd/root/example.com/
example vhost
.TP
If the requested URI begins with
.BR /magic/ ,
.I httpd
.B /services/httpd/config.db
loads the module associated with the remaining part of the URI.
Take care to configure the name space sensibly.
Simple servers
.I echo
and
.I stats
config file

.SH EXAMPLE config.db
.EX
debug
#nodebug
vhost
are provided (see below).
.PP
.I Httpd
ctlchan=shttpd
has the following options:
.TP
.BI -a " address"
Listen for calls on the given
.IR address ,
expressed using the syntax of
.IR dial (2).
accesslog=/services/httpd/access.log
announce=net!www.example.com!80

mime    ext=.text       type='text/plain; charset=utf-8'
mime    ext=.mov        type='video/quicktime'
mime    ext=.erl        type='text/plain; charset=utf-8'

.TP
.BI -c " cachesize"
Set the size of the daemon's cache to
.I cachesize
kilobytes. The default is a five megabyte cache.
# port=80 is not necessary, it's the default
host=www.example.com port=80
        listings path=''
        cachesecs=60
        index   file=index.html file=index.htm file=index.txt
.TP
.B -D
Debugging information is written to the file
.BR /services/httpd/httpd.debug .
.PP
.I Echo
is a trivial server that just returns the method, URI, any search, and the headers sent by the client.
.PP
.I Stats
is an equally simple server that queries the cache and returns information to the user about pages stored in the cache.
.PP
More complex services can be written to
.IR httpd 's
private interface.
The file
        redir   src='^/oldfile$'        dst=/newfile
.B httpd.m
(in
.BR /appl/svc/httpd )
defines constants and adts used by
        redir   src='^/oldpath/(.*)$'   dst=/newpath/$1

.IR httpd .
The file
.B cgi.m
defines the
module
alias
.L Cgi
which is the interface for programs called using the URI
.BR /magic/ .
.SH FILES
.TF "/services/httpd/httpd.rewrite  "
.TP
.B /services/httpd/root
        host=example.com port=80 usehost=www.example.com useport=80
.EE

Root of the served web content.
.TP
.B /services/httpd/httpd.debug
Logfile for debugging information.
For complete documentation see
.TP
.B /services/httpd/httpd.log
.I httpd
.IR shttpd (8),
logfile.
.TP
.B /services/httpd/httpd.rewrite
File to redirect specific URI requests.
.IR attrdb (6)

A cluster setup can export a file like this to support distributing work over a grid. A grid-specific svc script may be provided in the future to facilitate this use-case.

.TP
.B /services/httpd/httpd.suff
File of recognizable suffixes and their content type.
.SH SOURCE
.B /appl/svc/httpd
.B /appl/svc/httpd.sh

.SH SEE ALSO
.IR svc (8)

Added man/8/shttpd.



























































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
.TH SHTTPD 8
.SH NAME
shttpd \- HTTP server
.SH SYNOPSIS
.B ip/shttpd
[
.B -dh
] [
.B -A
.I path realm user:pass
] [
.B -C
.I cachesecs
] [
.B -L
.I listpath 0|1
] [
.B -a
.I addr
] [
.B -c
.I path command methods
] [
.B -f
.I ctlchan
] [
.B -i
.I indexfile
] [
.B -l
.I logfile
] [
.B -n
.I config
] [
.B -r
.I pathre dest
] [
.B -s
.I path addr methods
] [
.B -t
.I extension mimetype
] [
.B -z
.I gzippath
]
.I webroot
.SH DESCRIPTION
.I Shttpd
is an HTTP server that supports most of the reasonable features of contemporary http servers:
.IP \(bu
http/1.0 and http/1.1 support
.IP \(bu
cgi and scgi support
.IP \(bu
directory listings
.IP \(bu
index file serving
.IP \(bu
redirections based on regular expressions
.IP \(bu
virtual hosting
.IP \(bu
determining mimetype based on file extension
.IP \(bu
"range" requests, for random access to files
.IP \(bu
access and error logging
.IP \(bu
configuration in attrdb format
.IP \(bu
as compliant as possible, where reasonable
.IP \(bu
mindful of security

.PP
.I Shttpd
serves files from
.IR webroot .
Options, described below, configure all features except virtual hosting.
For virtual hosting, a configuration file must be used and the command-line options will only apply to the "default" hostname (i.e. all besides those explicitly configured).  The configuration file, specified using
.BI -n " config"
is in
.I attrdb(6)
format.  It is read only at startup and at explicit request.
The attributes are described below, with their corresponding command-line options.  An example configuration file:

.PP
.EX
debug
#nodebug
vhost
#novhost
ctlchan=shttpd
accesslog=/services/logs/shttpdaccess
announce=net!www.example.com!80

mime    ext=.text       type='text/plain; charset=utf-8'
mime    ext=.mov        type='video/quicktime'
mime    ext=.erl        type='text/plain; charset=utf-8'

# port=80 is not necessary, it's the default
host=www.example.com port=80
        listings	path=''
        cachesecs=60
        index   file=index.html file=index.htm file=index.txt
        redir   src='^/oldfile$'        dst=/newfile
        redir   src='^/oldpath/(.*)$'   dst=/newpath/$1
        scgi    path=/scgi/test         addr=net!localhost!4000
        cgi     path=/cgi/env           methods=GET,HEAD cmd='{load std; echo Status: 200 OK; echo content-type: text/plain; echo; cd /env && for(i in *) { echo $i''=''`{cat $i}}}'
        auth    path=/secret   realm='secret place'    user=username pass=password

alias   
        host=example.com port=80 usehost=www.example.com useport=80
.EE

.PP
The options and their configuration file equivalents:
.PP
.TP
.B -d
Print debug messages to standard error and the error log,
.IR /services/logs/shttpderror .
Attributes `debug' and `nodebug' enable and disable debugging.  Due to attrdb, `nodebug' always takes precedence regardless of position in file.
.TP
.B -h
Serve multiple domains, known as virtual hosting.  The `host'-header in the request (for http/1.1-only) selects the targeted host.  If enabled, the
.I host
and TCP
.I port
in the request are looked up in the configuration, and files are served from
.IR webroot/host!port .
Note that the port is not taken from the `host'-header, but always from the local port of the connection.
If no configuration could be found or when no specific host was requested (e.g. for http/1.0 requests), the default configuration will be used:  host `_default' and port 80.
Files in
.I webroot
are never served directly with
.B -h
present.
Attributes `vhost' and `novhost' enable and disable virtual hosting.  Due to attrdb, `novhost' always takes precedence regardless of position in file.
.br
Virtual hosts can only be specified with the configuration file.  A
`host'
entry starts a configuration for a domain, attribute
`port'
is optional and defaults to 80.
The value for
`host'
may be `*'.  In this case the entry will serve as default entry, used when no other entry matches an incoming request.
A host configuraty entry can be reused for another host by an entry with attribute `alias' (value ignored).  Attributes
`host'
and
`port'
specify the new host,
attributes
`usehost'
and
`useport'
specify which entry to use for requests instead.
`Port' may be omitted, defaulting to `80'.  `Usehost' defaults to the value of `port'.
.TP
.BI -L " path 0|1"
For
.I path
and its subdirectories, set whether the request for a directory returns a html-formatted listing of files (when the second parameter is `1'), or a "file not found"-error (when the second parameter is `0').
Listings are only returned when no index file (see
.BR -i )
The per-host configuration attributes are
`listings' and `nolistings' (value ignored).  One or more paths can be specified using the attribute `path'.
In determining whether to list directory contents, the most specific match (longest prefix) wins.
.TP
.BI -A " path realm user:pass"
Require authorization for
.IR path .
The match on
.I path
is a prefix-match.
Note that the path does not have to end with a slash.
Only insecure "basic" authorization is currently supported, "digest" is not.
The per-host configuration attribute is
`auth' (value ignored).
`Path'
specifies the path,
`realm'
the descriptive realm,
`user'
the user name and
`pass'
the password.
Paths
may occur multiple times in different `auth'-lines, each valid user/pass combination is allowed access.
.TP
.BI -C " cachesecs"
Add header to allow clients to keep the response in their cache for
.I cachesecs
seconds.  This only applies to static content (i.e. files and directory listings) not cgi and scgi handlers.
The per-host configuration attribute is
.IR cachesecs .
.TP
.BI -a " address"
Announce to
.I address
and listen for incoming connection.
The global configuration attribute is
`announce',
the value is the address to listen on.
For a reload of the configuration attributes, the announce-addresses are ignored.  To announce to a different set of ports, restart
.IR shttpd .
If no addresses are specified,
.I shttpd
will listen on
.IR net!*!http .
.TP
.BI -c " path command methods"
Handle requests for
.I path
by executing
.IR command .
The normal CGI/1.1 rules apply for
.IR command .
.I Path
is prefix-matched and does not have to end with a slash.
.I Command
is executed using
.IR sh (2).
.I Methods
is a comma- or space-separated list of methods (case-sensitive) that are allowed on the resource.  An empty list allows all methods.
The per-host configuration attribute is
`cgi'
(value ignored).
`Path'
specifies the host,
`cmd'
the command and
`methos' the methods.
.TP
.BI -f " ctlchan"
Create a
.IR sys-file2chan (2)
control file in
.I /chan
named
.IR ctlchan .
Currently, only the command `reload' is accepted.  It reloads the configuration file currently in use.
This is a global configuration file option, the corresponding attribute is
`ctlchan'.
Only a single control file can be registered.
.TP
.BI -i " indexfile"
Search for the file named
.I indexfile
when a directory is requested and return that instead.  This is commonly used to serve an
`index.html'.
Multiple file names can be specified, each will be tried in turn until a match is found.
The per-host configuration attribute is
`index' (value ignored).
Multiple attributes
`file'
can be specified, each being handled as
.B -i
.IR indexfile .
.TP
.BI -l " logfile"
Write the access log to
.IR logfile .
For each response, the following is printed (as a list of quoted words, quoted as in
.IR sh (1)):
Connection id, timestamp, remote and local ip and port, method, requested host (from `host'-header), path (with query), http version, response code, message and length, the user-agent that sent the request, the referer and finally the domain name for the ip address.
The global configuration attribute is
`accesslog'.  The file is also reopened on a reload of the configuration file.
.TP
.BI -n " config"
Use
.I config
of the configuraton file, which is in
.IR attrdb (6)
format.
There is no default configuration file.  The command-line options can be used for simple configurations.
Since command-line options are handled in the order specified and
.B -n
overrides the current configuration, command-line options specified before
.B -n
are effectively ignored.  Options specified after
.B -n
are used for the `default' host.  Note that a reload also replaces all command-line options.
There is no equivalent for the configuration file.  Be sure to use full path names on the command-line if you want reloads to work.
.TP
.BI -r " pathre dest"
Redirect requests that match regular expression
.I pathre
to
.I dest
with an HTTP ``301 Moved Permanently'' response.
.I Pathre
can contain groups, specified with ()'s as per
.IR regex (6)
syntax.  Occurrences of $0, $1, etc. in 
.I dest
are replaced by the corresponding group in
.IR pathre .
Group `$0' is the entire match and `$1' the first match.  Occurrences of `$$' will be replaced by the literal `$'.
For
.IR pathre ,
`^' means beginning of path and `$' means end of path.
The per-host configuration attribute is
`redir' (value ignored).
`Src'
is the equivalent of
.IR pathre ,
`dst'
the equivalent of
.IR dest .
.TP
.BI -s " path addr methods"
Handle requests for
.I path
by passing the requests to the SCGI handler at
.IR addr .
.I Path
is prefix-matched and need not end with a slash.
.I Methods
is a comma- or space-separated list of methods (case-sensitive) that are allowed on the resource.  An empty list allows all methods.
The per-host configuration attribute is
`scgi'
(value unused).
`Path'
specifies the path,
`addr'
the address and
`methods' the methods.
.TP
.BI -t " extension mimetype"
Registers extension (which is suffix-matched and thus should usually include a dot) as being of
.IR mimetype .
For each response returning a static file, the mimetype to be returned is looked up in the types specified by
.B -t
and compiled-in types, in that order.
The global configuration attribute is
`mime' (value unused).
`Ext'
specifies the extension,
`type'
the mimetype.
.TP
.BI -z " gzippath"
For a requested
.I path
starting with
.IR gzippath ,
return the gzip-compressed version
.I path.gz
instead.
.I Path.gz
is only returned if it exists and is smaller than the plain version, and
.I path
was not modified after
.IR path.gz .
The per-host configuration attribute is `gzip' (value unused), one
or more `path' attributes specify the paths.

.PP
There is one last per-host configuration attribute that cannot be specified on the command-line:
`listen' (value unused).
On the same line,
`ip'
should be present and
`port'
may be present (it defaults to the port of the host definition).
If virtual hosts are enabled, the local address is checked for each request.  If at least one ip address has been specified and the local address is not present in the addresses list of the per-host configuration for the request, a ``404 Object Not Found'' error is returned.

.PP
To prevent files to be served to the public inadvertently, the root directory of the
.I shttpd
is replaced by
.I webroot
with
.IR sys-bind (2).
Also, suspicious combinations of headers are typically responded to with an error.  This policy may err on the cautious side.  For example, some important headers are not allowed to be specified twice.
Note that CGI programs run in the namespace
.I shttpd
had originally been started with.

.SH SOURCE
.B /appl/cmd/ip/shttpd.b
.SH SEE ALSO
.IR attrdb (6),
.IR regex (6)
.PP
SCGI protocol: http://python.ca/scgi/protocol.txt
.br
RFC1945: "Hypertext Transfer Protocol -- HTTP/1.0"
.br
RFC2616: "Hypertext Transfer Protocol -- HTTP/1.1"
.SH BUGS
Attrdb was not designed for configuration file use.  The per-host configuration attributes can not be nicely grouped as top-level entries can.  No line numbers are printed for errors.
.PP
Usernames and passwords should be read from factotum and not be sent in the clear.
.PP
Incompatibilities with the rfcs:
.br
* If the `host'-header references a non-existing domain name and virtual hosting is enabled,
.I shttpd
responds with `404 Object Not Found', instead of the rfc2626-required `400 Bad Request'.
.br
* For http/1.0 requests, the `host'-header is also used.
.br
* Only a single format of dates is understood, three are specified (but deprecated).
.I Shttpd
returns an error when a date that can not be parsed might result in incorrect behaviour (rather can only being less efficient, e.g. in the context of caching).

Changes to man/8/svc.

126
127
128
129
130
131
132


133
134
135
136
137
138
139
140
141
142
143
144
145


126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

147
148







+
+












-
+
+
.B /appl/svc/net.sh
.br
.B /appl/svc/registry.sh
.br
.B /appl/svc/rstyx.sh
.br
.B /appl/svc/styx.sh
.SH AUX. SERVICES
.IR httpd (8)
.SH SEE ALSO
.IR listen (1),
.IR export (4),
.IR keyfs (4),
.IR keysrv (4),
.IR registry (4),
.IR changelogin (8),
.IR createsignerkey (8),
.IR cs (8),
.IR dns (8),
.IR logind (8),
.IR rstyxd (8),
.IR signer (8)
.IR signer (8),
.IR init (8)

Changes to services/httpd/httpd.suff.

16
17
18
19
20
21
22

23
24
25
26
27
28
29
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30







+







.bib		text		plain		-		# BibTex input
.c		text		plain		-		# C program
.c++		text		plain		-		# C++ program
.cc		text		plain		-		# [Mosaic]
.cdf		application	x-netcdf	-
.cpio		application	x-cpio		-
.cpp		text		plain		-		# DOS C++ program
.css		text		css		-		# html stylesheet
.dat		text		plain		-		# AMPL et al.
.diff		text		plain		-
.dvi		application	x-dvi		-		# TeX output
.enc		application	octet-stream	-		# encrypted file
.eps		application	postscript	-
.etx		text		x-setext	-		# [Mosaic]
.exe		application	octet-stream	-		# DOS executable
37
38
39
40
41
42
43

44
45
46
47
48

49
50
51
52
53
54
55
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58







+





+







.gz		-		-		x-gzip		# gziped file
.h		text		plain		-		# C header file
.hdf		application	x-hdf		-
.hqx		application	octet-stream	-		# Mac BinHex
.htm		text		html		-
.html		text		html		-
.ief		image		ief		-		# [Mosaic]
.ico		image		x-icon		-		# favicon
.jfif		image		jpeg		-		# [Mosaic]
.jfif-tbnl	image		jpeg		-		# [Mosaic]
.jpe		image		jpeg		-		# [Mosaic]
.jpeg		image		jpeg		-
.jpg		image		jpeg		-
.js		text		javascript	-		# ECMAscript
.latex		application	x-latex		-		# [Mosaic]
.ltx		application	x-latex		-
.man		application	x-troff-man	-		# [Mosaic]
.me		application	x-troff-me	-		# [Mosaic]
.mime		message		rfc822		-		# [Mosaic]
.mod		text		plain		-		# AMPL et al.
.mov		video		quicktime	-		# [Mosaic]
64
65
66
67
68
69
70

71
72
73
74
75
76
77
78
79
80
81
82
83




84
85

86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103


104
105
106
107
108
109
110

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83




84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118







+









-
-
-
-
+
+
+
+


+


















+
+







+
.oda		application	oda		-		# [Mosaic]
.pbm		image		x-portable-bitmap	-	# [Mosaic]
.pdf		application	pdf		-		# Adobe Portable Document Format
.pgm		image		x-portable-graymap	-	# [Mosaic]
.pl		text		plain		-		# [Mosaic]
.pnm		image		x-portable-anymap	-	# [Mosaic]
.ppm		image		x-portable-pixmap	-	# [Mosaic]
.png		image		png			-	# Portable Network Graphic
.ps		application	postscript	-
.qt		video		quicktime	-		# [Mosaic]
.r		text		plain		-		# ratfor program
.ras		image		x-cmu-rast	-		# [Mosaic]
.rc		text		plain		-		# rc
.rfr		text		plain		-		# refer
.rgb		image		x-rgb		-		# [Mosaic]
.roff		application	x-troff		-		# [Mosaic]
.rtf		application	rtf		-		# [Mosaic]
.rtx		text		richtext 	-	# MIME richtext	  [Mosaic]
.sh		application	x-shar		-
.shar		application	x-shar		-
.snd		audio		basic		-
.rtx		text		richtext 	-		# MIME richtext	  [Mosaic]
.sh		application	x-shar		-		
.shar		application	x-shar		-		
.snd		audio		basic		-		
.sv4cpio	application	x-sv4cpio	-		# [Mosaic]
.sv4crc		application	x-sv4crc	-		# [Mosaic]
.svg		image		svg+xml		-		# vector graphic
.t		application	x-troff		-		# [Mosaic]
.tar		application	x-tar		-		# [Mosaic]
.taz		application	x-tar		x-compress
.tcl		application	x-tcl		-
.tex		application	x-tex		-		# Tex input
.texi		application	x-texinfo	-		# [Mosaic]
.texinfo	application	x-texinfo	-		# [Mosaic]
.text		text		plain		-		# [Mosaic]
.tgz		application	x-tar		x-gzip
.tif		image		tiff		-
.tiff		image		tiff		-
.toc		text		plain		-		# table of contents
.tr		application	x-troff		-		# [Mosaic]
.trz		application	x-tar		x-compress
.tsv		text		tab-separated-values	-	# [Mosaic]
.txt		text		plain		-
.ustar		application	x-ustar		-		# [Mosaic]
.wav		audio		x-wav		-
.woff		application	font-woff	-		# webfont 1
.woff2		font		woff2		-		# webfont 2
.wsrc		application	x-wais-source	-		# [Mosaic]
.xbm		image		x-xbitmap	-		# X bitmap
.xpm		image		x-xpixmap	-		# [Mosaic]
.xwd		image		x-xwindowdump	-		# [Mosaic]
.z		-		-		x-compress
.Z		-		-		x-compress
.zip		application	zip		-
# vi: ts=8

Changes to utils/start-tomo.

1


2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
10

+
+







#!/usr/bin/env rc
# requires <https://9fans.github.io/plan9port/> ⋄ xrandr

## locations
iroot = /opt/tomo
if (! ~ $TOMO_IROOT '') { iroot = $TOMO_IROOT }
emu_cmd = $iroot^/Linux/386/bin/emu

## setup display
emu_display = 800x480

Changes to utils/tomo-dev.sh.

44
45
46
47
48
49
50
51

52
53

54
55
56
57
58
59
60
44
45
46
47
48
49
50

51
52

53
54
55
56
57
58
59
60







-
+

-
+







		DEBIAN_STABLE=buster
		debootstrap --arch i386 $DEBIAN_STABLE $MY_CHROOT http://deb.debian.org/debian/
		exit 0
		;;
	enter-chroot)
		shift
		MY_CHROOT=$1
		echo "proc $MY_CHROOT/proc proc defaults 0 0" >> /etc/fstab
		#echo "proc $MY_CHROOT/proc proc defaults 0 0" >> /etc/fstab
		mount proc $MY_CHROOT/proc -t proc
		echo "sysfs $MY_CHROOT/sys sysfs defaults 0 0" >> /etc/fstab
		#echo "sysfs $MY_CHROOT/sys sysfs defaults 0 0" >> /etc/fstab
		mount sysfs $MY_CHROOT/sys -t sysfs
		cp /etc/hosts $MY_CHROOT/etc/hosts
		cp /proc/mounts $MY_CHROOT/etc/mtab
		exec chroot $MY_CHROOT /bin/bash
		;;
	bind-chroot)
		shift
79
80
81
82
83
84
85

86
87
88









89
90
91
92
93
94
95
96




97
98
99
100
101
102
103
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117







+



+
+
+
+
+
+
+
+
+








+
+
+
+







		shift
		set -e
		export iroot=$1
		export syshost=$2
		export objtype=$3
		export PATH=$iroot/$syshost/$objtype/bin:$PATH
		./makemk.sh
		mk mkdirs
		mk nuke
		mk install
		;;
	nuke)
		shift
		set -e
		export iroot=$1
		export syshost=$2
		export objtype=$3
		export PATH=$iroot/$syshost/$objtype/bin:$PATH
		mk nuke
		;;
	rebuild)
		shift
		export iroot=$1
		export syshost=$2
		export objtype=$3
		export PATH=$iroot/$syshost/$objtype/bin:$PATH
		mk install
		;;
	nuke-Linux)
		shift
		$0 nuke ${1:-"/opt/tomo"} Linux 386
		;;
	rebuild-Linux)
		shift
		$0 rebuild ${1:-"/opt/tomo"} Linux 386
		;;
	build-Linux)
		shift
		$0 build ${1:-"/opt/tomo"} Linux 386
115
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130
131
129
130
131
132
133
134
135

136
137
138
139
140
141
142
143
144
145







-
+









		shift
		# since we host on fossil, the release-upload script can be hosted using
		# the ext feature so access can be managed in the usual way!
		# https://fossil-scm.org/home/doc/trunk/www/serverext.wiki
		artifact="$1"
		curl -vSsf -m 360 \
			-X POST \
			--data-binary "@`abspath $artifact`" \
			--data-binary "@`realpath $artifact`" \
			"https://$HP_CI_UPLOAD_KEY@$HP_CI_UPLOAD_ENDPOINT?n=$artifact"
		;;
	*)
		echo "$0 [make-chroot|enter-chroot] MY_CHROOT"
		echo TODO: print useful help
		exit 1
		;;
esac

Added utils/tomo-shell.













1
2
3
4
5
6
7
8
9
10
11
12
+
+
+
+
+
+
+
+
+
+
+
+
#!/usr/bin/env rc
# * https://9fans.github.io/plan9port/
# * xorg xrandr / x11-xserver-utils
# * xorg xsetroot / x11-xserver-utils
# PATH=$PATH:/opt/tomo/Linux/386/bin:/opt/tomo/utils
TOMO_SCREEN = `{xrandr \
	| 9 grep '\*' \
	| 9 awk '{print $1}' \
	| 9 sort \
	| 9 head -n1}
xsetroot -cursor_name left_ptr
start-tomo $* -- :0 vt$XDG_VTNR