1package matchers
2
3var (
4	TypeEpub   = newType("epub", "application/epub+zip")
5	TypeZip    = newType("zip", "application/zip")
6	TypeTar    = newType("tar", "application/x-tar")
7	TypeRar    = newType("rar", "application/x-rar-compressed")
8	TypeGz     = newType("gz", "application/gzip")
9	TypeBz2    = newType("bz2", "application/x-bzip2")
10	Type7z     = newType("7z", "application/x-7z-compressed")
11	TypeXz     = newType("xz", "application/x-xz")
12	TypePdf    = newType("pdf", "application/pdf")
13	TypeExe    = newType("exe", "application/x-msdownload")
14	TypeSwf    = newType("swf", "application/x-shockwave-flash")
15	TypeRtf    = newType("rtf", "application/rtf")
16	TypeEot    = newType("eot", "application/octet-stream")
17	TypePs     = newType("ps", "application/postscript")
18	TypeSqlite = newType("sqlite", "application/x-sqlite3")
19	TypeNes    = newType("nes", "application/x-nintendo-nes-rom")
20	TypeCrx    = newType("crx", "application/x-google-chrome-extension")
21	TypeCab    = newType("cab", "application/vnd.ms-cab-compressed")
22	TypeDeb    = newType("deb", "application/x-deb")
23	TypeAr     = newType("ar", "application/x-unix-archive")
24	TypeZ      = newType("Z", "application/x-compress")
25	TypeLz     = newType("lz", "application/x-lzip")
26	TypeRpm    = newType("rpm", "application/x-rpm")
27	TypeElf    = newType("elf", "application/x-executable")
28)
29
30var Archive = Map{
31	TypeEpub:   Epub,
32	TypeZip:    Zip,
33	TypeTar:    Tar,
34	TypeRar:    Rar,
35	TypeGz:     Gz,
36	TypeBz2:    Bz2,
37	Type7z:     SevenZ,
38	TypeXz:     Xz,
39	TypePdf:    Pdf,
40	TypeExe:    Exe,
41	TypeSwf:    Swf,
42	TypeRtf:    Rtf,
43	TypeEot:    Eot,
44	TypePs:     Ps,
45	TypeSqlite: Sqlite,
46	TypeNes:    Nes,
47	TypeCrx:    Crx,
48	TypeCab:    Cab,
49	TypeDeb:    Deb,
50	TypeAr:     Ar,
51	TypeZ:      Z,
52	TypeLz:     Lz,
53	TypeRpm:    Rpm,
54	TypeElf:    Elf,
55}
56
57func Epub(buf []byte) bool {
58	return len(buf) > 57 &&
59		buf[0] == 0x50 && buf[1] == 0x4B && buf[2] == 0x3 && buf[3] == 0x4 &&
60		buf[30] == 0x6D && buf[31] == 0x69 && buf[32] == 0x6D && buf[33] == 0x65 &&
61		buf[34] == 0x74 && buf[35] == 0x79 && buf[36] == 0x70 && buf[37] == 0x65 &&
62		buf[38] == 0x61 && buf[39] == 0x70 && buf[40] == 0x70 && buf[41] == 0x6C &&
63		buf[42] == 0x69 && buf[43] == 0x63 && buf[44] == 0x61 && buf[45] == 0x74 &&
64		buf[46] == 0x69 && buf[47] == 0x6F && buf[48] == 0x6E && buf[49] == 0x2F &&
65		buf[50] == 0x65 && buf[51] == 0x70 && buf[52] == 0x75 && buf[53] == 0x62 &&
66		buf[54] == 0x2B && buf[55] == 0x7A && buf[56] == 0x69 && buf[57] == 0x70
67}
68
69func Zip(buf []byte) bool {
70	return len(buf) > 3 &&
71		buf[0] == 0x50 && buf[1] == 0x4B &&
72		(buf[2] == 0x3 || buf[2] == 0x5 || buf[2] == 0x7) &&
73		(buf[3] == 0x4 || buf[3] == 0x6 || buf[3] == 0x8)
74}
75
76func Tar(buf []byte) bool {
77	return len(buf) > 261 &&
78		buf[257] == 0x75 && buf[258] == 0x73 &&
79		buf[259] == 0x74 && buf[260] == 0x61 &&
80		buf[261] == 0x72
81}
82
83func Rar(buf []byte) bool {
84	return len(buf) > 6 &&
85		buf[0] == 0x52 && buf[1] == 0x61 && buf[2] == 0x72 &&
86		buf[3] == 0x21 && buf[4] == 0x1A && buf[5] == 0x7 &&
87		(buf[6] == 0x0 || buf[6] == 0x1)
88}
89
90func Gz(buf []byte) bool {
91	return len(buf) > 2 &&
92		buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x8
93}
94
95func Bz2(buf []byte) bool {
96	return len(buf) > 2 &&
97		buf[0] == 0x42 && buf[1] == 0x5A && buf[2] == 0x68
98}
99
100func SevenZ(buf []byte) bool {
101	return len(buf) > 5 &&
102		buf[0] == 0x37 && buf[1] == 0x7A && buf[2] == 0xBC &&
103		buf[3] == 0xAF && buf[4] == 0x27 && buf[5] == 0x1C
104}
105
106func Pdf(buf []byte) bool {
107	return len(buf) > 3 &&
108		buf[0] == 0x25 && buf[1] == 0x50 &&
109		buf[2] == 0x44 && buf[3] == 0x46
110}
111
112func Exe(buf []byte) bool {
113	return len(buf) > 1 &&
114		buf[0] == 0x4D && buf[1] == 0x5A
115}
116
117func Swf(buf []byte) bool {
118	return len(buf) > 2 &&
119		(buf[0] == 0x43 || buf[0] == 0x46) &&
120		buf[1] == 0x57 && buf[2] == 0x53
121}
122
123func Rtf(buf []byte) bool {
124	return len(buf) > 4 &&
125		buf[0] == 0x7B && buf[1] == 0x5C &&
126		buf[2] == 0x72 && buf[3] == 0x74 &&
127		buf[4] == 0x66
128}
129
130func Nes(buf []byte) bool {
131	return len(buf) > 3 &&
132		buf[0] == 0x4E && buf[1] == 0x45 &&
133		buf[2] == 0x53 && buf[3] == 0x1A
134}
135
136func Crx(buf []byte) bool {
137	return len(buf) > 3 &&
138		buf[0] == 0x43 && buf[1] == 0x72 &&
139		buf[2] == 0x32 && buf[3] == 0x34
140}
141
142func Cab(buf []byte) bool {
143	return len(buf) > 3 &&
144		((buf[0] == 0x4D && buf[1] == 0x53 && buf[2] == 0x43 && buf[3] == 0x46) ||
145			(buf[0] == 0x49 && buf[1] == 0x53 && buf[2] == 0x63 && buf[3] == 0x28))
146}
147
148func Eot(buf []byte) bool {
149	return len(buf) > 35 &&
150		buf[34] == 0x4C && buf[35] == 0x50 &&
151		((buf[8] == 0x02 && buf[9] == 0x00 &&
152			buf[10] == 0x01) || (buf[8] == 0x01 &&
153			buf[9] == 0x00 && buf[10] == 0x00) ||
154			(buf[8] == 0x02 && buf[9] == 0x00 &&
155				buf[10] == 0x02))
156}
157
158func Ps(buf []byte) bool {
159	return len(buf) > 1 &&
160		buf[0] == 0x25 && buf[1] == 0x21
161}
162
163func Xz(buf []byte) bool {
164	return len(buf) > 5 &&
165		buf[0] == 0xFD && buf[1] == 0x37 &&
166		buf[2] == 0x7A && buf[3] == 0x58 &&
167		buf[4] == 0x5A && buf[5] == 0x00
168}
169
170func Sqlite(buf []byte) bool {
171	return len(buf) > 3 &&
172		buf[0] == 0x53 && buf[1] == 0x51 &&
173		buf[2] == 0x4C && buf[3] == 0x69
174}
175
176func Deb(buf []byte) bool {
177	return len(buf) > 20 &&
178		buf[0] == 0x21 && buf[1] == 0x3C && buf[2] == 0x61 &&
179		buf[3] == 0x72 && buf[4] == 0x63 && buf[5] == 0x68 &&
180		buf[6] == 0x3E && buf[7] == 0x0A && buf[8] == 0x64 &&
181		buf[9] == 0x65 && buf[10] == 0x62 && buf[11] == 0x69 &&
182		buf[12] == 0x61 && buf[13] == 0x6E && buf[14] == 0x2D &&
183		buf[15] == 0x62 && buf[16] == 0x69 && buf[17] == 0x6E &&
184		buf[18] == 0x61 && buf[19] == 0x72 && buf[20] == 0x79
185}
186
187func Ar(buf []byte) bool {
188	return len(buf) > 6 &&
189		buf[0] == 0x21 && buf[1] == 0x3C &&
190		buf[2] == 0x61 && buf[3] == 0x72 &&
191		buf[4] == 0x63 && buf[5] == 0x68 &&
192		buf[6] == 0x3E
193}
194
195func Z(buf []byte) bool {
196	return len(buf) > 1 &&
197		((buf[0] == 0x1F && buf[1] == 0xA0) ||
198			(buf[0] == 0x1F && buf[1] == 0x9D))
199}
200
201func Lz(buf []byte) bool {
202	return len(buf) > 3 &&
203		buf[0] == 0x4C && buf[1] == 0x5A &&
204		buf[2] == 0x49 && buf[3] == 0x50
205}
206
207func Rpm(buf []byte) bool {
208	return len(buf) > 96 &&
209		buf[0] == 0xED && buf[1] == 0xAB &&
210		buf[2] == 0xEE && buf[3] == 0xDB
211}
212
213func Elf(buf []byte) bool {
214	return len(buf) > 52 &&
215		buf[0] == 0x7F && buf[1] == 0x45 &&
216		buf[2] == 0x4C && buf[3] == 0x46
217}
218