@hyperbook/markdown 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/directive-typst/client.js +631 -0
- package/dist/assets/directive-typst/style.css +467 -0
- package/dist/assets/prism/prism-typst.js +182 -0
- package/dist/assets/store.js +2 -1
- package/dist/assets/uzip/uzip.js +1538 -0
- package/dist/index.js +424 -2
- package/dist/index.js.map +4 -4
- package/dist/locales/de.json +21 -1
- package/dist/locales/en.json +21 -1
- package/dist/remarkDirectiveTypst.d.ts +5 -0
- package/package.json +3 -3
|
@@ -0,0 +1,1538 @@
|
|
|
1
|
+
var UZIP = {};
|
|
2
|
+
|
|
3
|
+
(function () {
|
|
4
|
+
var B = {
|
|
5
|
+
readUshort: function (buff, p) {
|
|
6
|
+
return buff[p] | (buff[p + 1] << 8);
|
|
7
|
+
},
|
|
8
|
+
writeUshort: function (buff, p, n) {
|
|
9
|
+
buff[p] = n & 255;
|
|
10
|
+
buff[p + 1] = (n >> 8) & 255;
|
|
11
|
+
},
|
|
12
|
+
readUint: function (buff, p) {
|
|
13
|
+
return (
|
|
14
|
+
buff[p + 3] * (256 * 256 * 256) +
|
|
15
|
+
((buff[p + 2] << 16) | (buff[p + 1] << 8) | buff[p])
|
|
16
|
+
);
|
|
17
|
+
},
|
|
18
|
+
writeUint: function (buff, p, n) {
|
|
19
|
+
buff[p] = n & 255;
|
|
20
|
+
buff[p + 1] = (n >> 8) & 255;
|
|
21
|
+
buff[p + 2] = (n >> 16) & 255;
|
|
22
|
+
buff[p + 3] = (n >> 24) & 255;
|
|
23
|
+
},
|
|
24
|
+
readASCII: function (buff, p, l) {
|
|
25
|
+
var s = "";
|
|
26
|
+
for (var i = 0; i < l; i++) s += String.fromCharCode(buff[p + i]);
|
|
27
|
+
return s;
|
|
28
|
+
},
|
|
29
|
+
writeASCII: function (data, p, s) {
|
|
30
|
+
for (var i = 0; i < s.length; i++) data[p + i] = s.charCodeAt(i);
|
|
31
|
+
},
|
|
32
|
+
pad: function (n) {
|
|
33
|
+
return n.length < 2 ? "0" + n : n;
|
|
34
|
+
},
|
|
35
|
+
readIBM: function (buff, p, l) {
|
|
36
|
+
var codes = [
|
|
37
|
+
0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, 0xea, 0xeb, 0xe8, 0xef,
|
|
38
|
+
0xee, 0xec, 0xc4, 0xc5, 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9,
|
|
39
|
+
0xff, 0xd6, 0xdc, 0xa2, 0xa3, 0xa5, 0xa7, 0x192, 0xe1, 0xed, 0xf3, 0xfa,
|
|
40
|
+
0xf1, 0xd1, 0xaa, 0xba, 0xbf, 0x2310, 0xac, 0xbd, 0xbc, 0xa1, 0xab,
|
|
41
|
+
0xbb,
|
|
42
|
+
];
|
|
43
|
+
var out = "";
|
|
44
|
+
for (var i = 0; i < l; i++) {
|
|
45
|
+
var cc = buff[p + i];
|
|
46
|
+
if (cc < 0x80) cc = cc;
|
|
47
|
+
else if (cc < 0xb0) cc = codes[cc - 0x80];
|
|
48
|
+
else return null;
|
|
49
|
+
out += String.fromCharCode(cc);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
},
|
|
53
|
+
readUTF8: function (buff, p, l) {
|
|
54
|
+
var s = "",
|
|
55
|
+
ns;
|
|
56
|
+
for (var i = 0; i < l; i++) s += "%" + B.pad(buff[p + i].toString(16));
|
|
57
|
+
try {
|
|
58
|
+
ns = decodeURIComponent(s);
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return B.readASCII(buff, p, l);
|
|
61
|
+
}
|
|
62
|
+
return ns;
|
|
63
|
+
},
|
|
64
|
+
writeUTF8: function (buff, p, str) {
|
|
65
|
+
var strl = str.length,
|
|
66
|
+
i = 0;
|
|
67
|
+
for (var ci = 0; ci < strl; ci++) {
|
|
68
|
+
var code = str.charCodeAt(ci);
|
|
69
|
+
if ((code & (0xffffffff - (1 << 7) + 1)) == 0) {
|
|
70
|
+
buff[p + i] = code;
|
|
71
|
+
i++;
|
|
72
|
+
} else if ((code & (0xffffffff - (1 << 11) + 1)) == 0) {
|
|
73
|
+
buff[p + i] = 192 | (code >> 6);
|
|
74
|
+
buff[p + i + 1] = 128 | ((code >> 0) & 63);
|
|
75
|
+
i += 2;
|
|
76
|
+
} else if ((code & (0xffffffff - (1 << 16) + 1)) == 0) {
|
|
77
|
+
buff[p + i] = 224 | (code >> 12);
|
|
78
|
+
buff[p + i + 1] = 128 | ((code >> 6) & 63);
|
|
79
|
+
buff[p + i + 2] = 128 | ((code >> 0) & 63);
|
|
80
|
+
i += 3;
|
|
81
|
+
} else if ((code & (0xffffffff - (1 << 21) + 1)) == 0) {
|
|
82
|
+
buff[p + i] = 240 | (code >> 18);
|
|
83
|
+
buff[p + i + 1] = 128 | ((code >> 12) & 63);
|
|
84
|
+
buff[p + i + 2] = 128 | ((code >> 6) & 63);
|
|
85
|
+
buff[p + i + 3] = 128 | ((code >> 0) & 63);
|
|
86
|
+
i += 4;
|
|
87
|
+
} else throw "e";
|
|
88
|
+
}
|
|
89
|
+
return i;
|
|
90
|
+
},
|
|
91
|
+
sizeUTF8: function (str) {
|
|
92
|
+
var strl = str.length,
|
|
93
|
+
i = 0;
|
|
94
|
+
for (var ci = 0; ci < strl; ci++) {
|
|
95
|
+
var code = str.charCodeAt(ci);
|
|
96
|
+
if ((code & (0xffffffff - (1 << 7) + 1)) == 0) {
|
|
97
|
+
i++;
|
|
98
|
+
} else if ((code & (0xffffffff - (1 << 11) + 1)) == 0) {
|
|
99
|
+
i += 2;
|
|
100
|
+
} else if ((code & (0xffffffff - (1 << 16) + 1)) == 0) {
|
|
101
|
+
i += 3;
|
|
102
|
+
} else if ((code & (0xffffffff - (1 << 21) + 1)) == 0) {
|
|
103
|
+
i += 4;
|
|
104
|
+
} else throw "e";
|
|
105
|
+
}
|
|
106
|
+
return i;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
var crc = {
|
|
111
|
+
table: (function () {
|
|
112
|
+
var tab = new Uint32Array(256);
|
|
113
|
+
for (var n = 0; n < 256; n++) {
|
|
114
|
+
var c = n;
|
|
115
|
+
for (var k = 0; k < 8; k++) {
|
|
116
|
+
if (c & 1) c = 0xedb88320 ^ (c >>> 1);
|
|
117
|
+
else c = c >>> 1;
|
|
118
|
+
}
|
|
119
|
+
tab[n] = c;
|
|
120
|
+
}
|
|
121
|
+
return tab;
|
|
122
|
+
})(),
|
|
123
|
+
update: function (c, buf, off, len) {
|
|
124
|
+
for (var i = 0; i < len; i++)
|
|
125
|
+
c = crc.table[(c ^ buf[off + i]) & 0xff] ^ (c >>> 8);
|
|
126
|
+
return c;
|
|
127
|
+
},
|
|
128
|
+
crc: function (b, o, l) {
|
|
129
|
+
return crc.update(0xffffffff, b, o, l) ^ 0xffffffff;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
function adler(data, o, len) {
|
|
134
|
+
var a = 1,
|
|
135
|
+
b = 0;
|
|
136
|
+
var off = o,
|
|
137
|
+
end = o + len;
|
|
138
|
+
while (off < end) {
|
|
139
|
+
var eend = Math.min(off + 5552, end);
|
|
140
|
+
while (off < eend) {
|
|
141
|
+
a += data[off++];
|
|
142
|
+
b += a;
|
|
143
|
+
}
|
|
144
|
+
a = a % 65521;
|
|
145
|
+
b = b % 65521;
|
|
146
|
+
}
|
|
147
|
+
return (b << 16) | a;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function parseTar(data) {
|
|
151
|
+
var off = 0,
|
|
152
|
+
out = {};
|
|
153
|
+
while (off + 1024 < data.length) {
|
|
154
|
+
var no = off;
|
|
155
|
+
while (data[no] != 0) no++;
|
|
156
|
+
var nam = B.readASCII(data, off, no - off);
|
|
157
|
+
off += 100;
|
|
158
|
+
off += 24;
|
|
159
|
+
var sz = parseInt(B.readASCII(data, off, 12), 8);
|
|
160
|
+
off += 12;
|
|
161
|
+
var tm = parseInt(B.readASCII(data, off, 12), 8);
|
|
162
|
+
off += 12;
|
|
163
|
+
// console.log(nam, sz, tm);
|
|
164
|
+
off += 8 + 1 + 100;
|
|
165
|
+
off += 6 + 2 + 32 + 32 + 8 + 8 + 155 + 12;
|
|
166
|
+
|
|
167
|
+
out[nam] = data.slice(off, off + sz);
|
|
168
|
+
off += sz;
|
|
169
|
+
|
|
170
|
+
var ex = off & 0x1ff;
|
|
171
|
+
if (ex != 0) off += 512 - ex;
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
/*
|
|
176
|
+
var parse7z = function() {
|
|
177
|
+
var rUs = B.readUshort, rUi = B.readUint;
|
|
178
|
+
var data, off;
|
|
179
|
+
|
|
180
|
+
function NUMBER() {
|
|
181
|
+
var v = data[off++];
|
|
182
|
+
if ((v&128)==0) return v;
|
|
183
|
+
else if((v& 64)==0) return ((((((v&63)<<8)+data[off++]) ) ) );
|
|
184
|
+
else if((v& 32)==0) return ((((((v&31)<<8)+data[off++])<<8)+data[off++]) );
|
|
185
|
+
else if((v& 16)==0) return ((((((v&31)<<8)+data[off++])<<8)+data[off++])<<8)+data[off++];
|
|
186
|
+
else throw v.toString(2);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function readProp() {
|
|
190
|
+
var ID = data[off++]; console.log(ID.toString(16));
|
|
191
|
+
|
|
192
|
+
if (ID==0x17) readProp(off); // EncodedHeader
|
|
193
|
+
else if(ID==0x06) { // PackInfo
|
|
194
|
+
var pos = NUMBER();
|
|
195
|
+
var cnt = NUMBER(); if(cnt!=1) throw "e";
|
|
196
|
+
|
|
197
|
+
console.log(pos, cnt);
|
|
198
|
+
|
|
199
|
+
console.log(data.slice(off));
|
|
200
|
+
|
|
201
|
+
var siz = readProp(); console.log(siz);
|
|
202
|
+
|
|
203
|
+
console.log(data.slice(off));
|
|
204
|
+
|
|
205
|
+
var crc = readProp(); console.log(crc);
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
console.log(data.slice(off));
|
|
209
|
+
}
|
|
210
|
+
else if(ID==0x09) { // Size
|
|
211
|
+
return NUMBER();
|
|
212
|
+
}
|
|
213
|
+
else throw ID;
|
|
214
|
+
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function pars(_d) {
|
|
218
|
+
data = _d; off=8;
|
|
219
|
+
|
|
220
|
+
var sign = [55, 122, 188, 175, 39, 28, 0, 4];
|
|
221
|
+
for(var i=0; i<8; i++) if(data[i]!=sign[i]) throw "e";
|
|
222
|
+
|
|
223
|
+
var crc = rUi(data,off); off+=4;
|
|
224
|
+
|
|
225
|
+
var nho = rUi(data,off); off+=8;
|
|
226
|
+
var nhs = rUi(data,off); off+=8;
|
|
227
|
+
var nhc = rUi(data,off); off+=4;
|
|
228
|
+
console.log(nho,nhs,nhc);
|
|
229
|
+
|
|
230
|
+
//var hdr=data[off++];
|
|
231
|
+
|
|
232
|
+
//console.log(hdr);
|
|
233
|
+
|
|
234
|
+
off = 32+nho;
|
|
235
|
+
readProp();
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
console.log(data.slice(off)); throw "e";
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return pars;
|
|
245
|
+
}();
|
|
246
|
+
*/
|
|
247
|
+
|
|
248
|
+
function parse(buf, onlyNames) {
|
|
249
|
+
// ArrayBuffer
|
|
250
|
+
var rUs = B.readUshort,
|
|
251
|
+
rUi = B.readUint,
|
|
252
|
+
o = 0,
|
|
253
|
+
out = {};
|
|
254
|
+
var data = new Uint8Array(buf);
|
|
255
|
+
if (data.length > 257 + 6 && B.readASCII(data, 257, 6) == "ustar ")
|
|
256
|
+
return parseTar(data);
|
|
257
|
+
//if(B.readASCII(data,0,2)=="7z") return parse7z(data);
|
|
258
|
+
|
|
259
|
+
var eocd = data.length - 4;
|
|
260
|
+
|
|
261
|
+
while (rUi(data, eocd) != 0x06054b50) eocd--;
|
|
262
|
+
|
|
263
|
+
var o = eocd;
|
|
264
|
+
o += 4; // sign = 0x06054b50
|
|
265
|
+
o += 4; // disks = 0;
|
|
266
|
+
var cnu = rUs(data, o);
|
|
267
|
+
o += 2;
|
|
268
|
+
var cnt = rUs(data, o);
|
|
269
|
+
o += 2;
|
|
270
|
+
|
|
271
|
+
var csize = rUi(data, o);
|
|
272
|
+
o += 4;
|
|
273
|
+
var coffs = rUi(data, o);
|
|
274
|
+
o += 4;
|
|
275
|
+
|
|
276
|
+
o = coffs;
|
|
277
|
+
for (var i = 0; i < cnu; i++) {
|
|
278
|
+
var sign = rUi(data, o);
|
|
279
|
+
o += 4;
|
|
280
|
+
o += 4; // versions;
|
|
281
|
+
o += 4; // flag + compr
|
|
282
|
+
var time = _readTime(data, o);
|
|
283
|
+
o += 4; // time
|
|
284
|
+
|
|
285
|
+
var crc32 = rUi(data, o);
|
|
286
|
+
o += 4;
|
|
287
|
+
var csize = rUi(data, o);
|
|
288
|
+
o += 4;
|
|
289
|
+
var usize = rUi(data, o);
|
|
290
|
+
o += 4;
|
|
291
|
+
|
|
292
|
+
var nl = rUs(data, o),
|
|
293
|
+
el = rUs(data, o + 2),
|
|
294
|
+
cl = rUs(data, o + 4);
|
|
295
|
+
o += 6; // name, extra, comment
|
|
296
|
+
o += 8; // disk, attribs
|
|
297
|
+
var roff = rUi(data, o);
|
|
298
|
+
o += 4;
|
|
299
|
+
|
|
300
|
+
o += nl;
|
|
301
|
+
|
|
302
|
+
var lo = 0;
|
|
303
|
+
while (lo < el) {
|
|
304
|
+
var id = rUs(data, o + lo);
|
|
305
|
+
lo += 2;
|
|
306
|
+
var sz = rUs(data, o + lo);
|
|
307
|
+
lo += 2;
|
|
308
|
+
if (id == 1) {
|
|
309
|
+
// Zip64
|
|
310
|
+
if (usize == 0xffffffff) {
|
|
311
|
+
usize = rUi(data, o + lo);
|
|
312
|
+
lo += 8;
|
|
313
|
+
}
|
|
314
|
+
if (csize == 0xffffffff) {
|
|
315
|
+
csize = rUi(data, o + lo);
|
|
316
|
+
lo += 8;
|
|
317
|
+
}
|
|
318
|
+
if (roff == 0xffffffff) {
|
|
319
|
+
roff = rUi(data, o + lo);
|
|
320
|
+
lo += 8;
|
|
321
|
+
}
|
|
322
|
+
} else lo += sz;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
o += el + cl;
|
|
326
|
+
|
|
327
|
+
_readLocal(data, roff, out, csize, usize, onlyNames);
|
|
328
|
+
}
|
|
329
|
+
//console.log(out);
|
|
330
|
+
return out;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function _readTime(data, o) {
|
|
334
|
+
var time = B.readUshort(data, o),
|
|
335
|
+
date = B.readUshort(data, o + 2);
|
|
336
|
+
var year = 1980 + (date >>> 9);
|
|
337
|
+
var mont = (date >>> 5) & 15;
|
|
338
|
+
var day = date & 31;
|
|
339
|
+
//console.log(year,mont,day);
|
|
340
|
+
|
|
341
|
+
var hour = time >>> 11;
|
|
342
|
+
var minu = (time >>> 5) & 63;
|
|
343
|
+
var seco = 2 * (time & 31);
|
|
344
|
+
|
|
345
|
+
var stamp = new Date(year, mont, day, hour, minu, seco).getTime();
|
|
346
|
+
|
|
347
|
+
//console.log(date,time);
|
|
348
|
+
return stamp;
|
|
349
|
+
}
|
|
350
|
+
function _writeTime(data, o, stamp) {
|
|
351
|
+
var dt = new Date(stamp);
|
|
352
|
+
var date =
|
|
353
|
+
((dt.getFullYear() - 1980) << 9) |
|
|
354
|
+
((dt.getMonth() + 1) << 5) |
|
|
355
|
+
dt.getDate();
|
|
356
|
+
var time =
|
|
357
|
+
(dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1);
|
|
358
|
+
B.writeUshort(data, o, time);
|
|
359
|
+
B.writeUshort(data, o + 2, date);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function _readLocal(data, o, out, csize, usize, onlyNames) {
|
|
363
|
+
var rUs = B.readUshort,
|
|
364
|
+
rUi = B.readUint;
|
|
365
|
+
var sign = rUi(data, o);
|
|
366
|
+
o += 4;
|
|
367
|
+
var ver = rUs(data, o);
|
|
368
|
+
o += 2;
|
|
369
|
+
var gpflg = rUs(data, o);
|
|
370
|
+
o += 2;
|
|
371
|
+
//if((gpflg&8)!=0) throw "unknown sizes";
|
|
372
|
+
var cmpr = rUs(data, o);
|
|
373
|
+
o += 2;
|
|
374
|
+
|
|
375
|
+
var time = _readTime(data, o);
|
|
376
|
+
o += 4;
|
|
377
|
+
|
|
378
|
+
var crc32 = rUi(data, o);
|
|
379
|
+
o += 4;
|
|
380
|
+
//var csize = rUi(data, o); o+=4;
|
|
381
|
+
//var usize = rUi(data, o); o+=4;
|
|
382
|
+
o += 8;
|
|
383
|
+
|
|
384
|
+
var nlen = rUs(data, o);
|
|
385
|
+
o += 2;
|
|
386
|
+
var elen = rUs(data, o);
|
|
387
|
+
o += 2;
|
|
388
|
+
|
|
389
|
+
var name =
|
|
390
|
+
(gpflg & 2048) == 0
|
|
391
|
+
? B.readIBM(data, o, nlen)
|
|
392
|
+
: B.readUTF8(data, o, nlen);
|
|
393
|
+
if (name == null) name = B.readUTF8(data, o, nlen);
|
|
394
|
+
o += nlen; //console.log(name);
|
|
395
|
+
o += elen;
|
|
396
|
+
|
|
397
|
+
//console.log(sign.toString(16), ver, gpflg, cmpr, crc32.toString(16), "csize, usize", csize, usize, nlen, elen, name, o);
|
|
398
|
+
if (onlyNames) {
|
|
399
|
+
out[name] = { size: usize, csize: csize };
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
var file = new Uint8Array(data.buffer, o);
|
|
403
|
+
if (gpflg & 1) {
|
|
404
|
+
out[name] = new Uint8Array(0);
|
|
405
|
+
alert("ZIPs with a password are not supported.", 3000);
|
|
406
|
+
} else if (cmpr == 0)
|
|
407
|
+
out[name] = new Uint8Array(file.buffer.slice(o, o + csize));
|
|
408
|
+
else if (cmpr == 8) {
|
|
409
|
+
var buf = new Uint8Array(usize);
|
|
410
|
+
inflateRaw(file, buf);
|
|
411
|
+
/*var nbuf = pako["inflateRaw"](file);
|
|
412
|
+
if(usize>8514000) {
|
|
413
|
+
//console.log(PUtils.readASCII(buf , 8514500, 500));
|
|
414
|
+
//console.log(PUtils.readASCII(nbuf, 8514500, 500));
|
|
415
|
+
}
|
|
416
|
+
for(var i=0; i<buf.length; i++) if(buf[i]!=nbuf[i]) { console.log(buf.length, nbuf.length, usize, i); throw "e"; }
|
|
417
|
+
*/
|
|
418
|
+
out[name] = buf;
|
|
419
|
+
} else if (cmpr == 14 && window["LZMA"]) {
|
|
420
|
+
var vsn = rUs(file, 0);
|
|
421
|
+
var siz = rUs(file, 2);
|
|
422
|
+
if (siz != 5) throw "unknown LZMA header";
|
|
423
|
+
|
|
424
|
+
var prp = file[4];
|
|
425
|
+
var dictSize = rUi(file, 5);
|
|
426
|
+
var lc = prp % 9;
|
|
427
|
+
prp = ~~(prp / 9);
|
|
428
|
+
var lp = prp % 5;
|
|
429
|
+
var pb = ~~(prp / 5);
|
|
430
|
+
//console.log(vsn,siz,dictSize,lc,lp,pb);
|
|
431
|
+
|
|
432
|
+
//console.log(file);
|
|
433
|
+
var time = Date.now();
|
|
434
|
+
var buf = (out[name] = new Uint8Array(usize));
|
|
435
|
+
|
|
436
|
+
var dec = new window["LZMA"]["Decoder"]();
|
|
437
|
+
dec["setProperties"]({ dsz: dictSize, lc: lc, lp: lp, pb: pb });
|
|
438
|
+
dec["decodeBody"](new Uint8Array(data.buffer, o + 9), buf, usize);
|
|
439
|
+
|
|
440
|
+
//console.log(Date.now()-time);
|
|
441
|
+
} else throw "unknown compression method: " + cmpr;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function UStream(buf) {
|
|
445
|
+
this.buf = buf;
|
|
446
|
+
this.off = 0;
|
|
447
|
+
}
|
|
448
|
+
UStream.prototype["readByte"] = function () {
|
|
449
|
+
return this.buf[this.off++];
|
|
450
|
+
};
|
|
451
|
+
UStream.prototype["writeByte"] = function (b) {
|
|
452
|
+
this.buf[this.off++] = b;
|
|
453
|
+
};
|
|
454
|
+
UStream.prototype["writeBytes"] = function (a, s) {
|
|
455
|
+
a = new Uint8Array(
|
|
456
|
+
a.buffer,
|
|
457
|
+
a.byteOffset,
|
|
458
|
+
Math.min(a.length, this.buf.length - this.off),
|
|
459
|
+
);
|
|
460
|
+
this.buf.set(a, this.off);
|
|
461
|
+
this.off += a.length;
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
function inflateRaw(file, buf) {
|
|
465
|
+
return UZIP["F"]["inflate"](file, buf);
|
|
466
|
+
}
|
|
467
|
+
function inflate(file, buf) {
|
|
468
|
+
var CMF = file[0],
|
|
469
|
+
FLG = file[1];
|
|
470
|
+
if (CMF == 31 && FLG == 139) {
|
|
471
|
+
// GZIP
|
|
472
|
+
var CM = file[2],
|
|
473
|
+
FLG = file[3];
|
|
474
|
+
if (CM != 8) throw CM; /* 8 is DEFLATE */
|
|
475
|
+
var off = 4;
|
|
476
|
+
off += 4; // MTIME
|
|
477
|
+
off += 2; // XFL, OS
|
|
478
|
+
if ((FLG & 4) != 0) throw "e"; // FEXTRA
|
|
479
|
+
if ((FLG & 8) != 0) {
|
|
480
|
+
// FNAME
|
|
481
|
+
while (file[off] != 0) off++;
|
|
482
|
+
off++;
|
|
483
|
+
}
|
|
484
|
+
if ((FLG & 16) != 0) throw "e"; // FCOMMENT
|
|
485
|
+
if ((FLG & 2) != 0) throw "e"; // FHCR
|
|
486
|
+
return inflateRaw(
|
|
487
|
+
new Uint8Array(
|
|
488
|
+
file.buffer,
|
|
489
|
+
file.byteOffset + off,
|
|
490
|
+
file.length - off - 8,
|
|
491
|
+
),
|
|
492
|
+
buf,
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
var CM = CMF & 15,
|
|
496
|
+
CINFO = CMF >>> 4;
|
|
497
|
+
//console.log(CM, CINFO,CMF,FLG);
|
|
498
|
+
return inflateRaw(
|
|
499
|
+
new Uint8Array(file.buffer, file.byteOffset + 2, file.length - 6),
|
|
500
|
+
buf,
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
function deflate(data, opts /*, buf, off*/) {
|
|
504
|
+
if (opts == null) opts = { level: 6 };
|
|
505
|
+
var off = 0,
|
|
506
|
+
buf = new Uint8Array(50 + Math.floor(data.length * 1.1));
|
|
507
|
+
buf[off] = 120;
|
|
508
|
+
buf[off + 1] = 156;
|
|
509
|
+
off += 2;
|
|
510
|
+
off = UZIP["F"]["deflateRaw"](data, buf, off, opts["level"]);
|
|
511
|
+
var crc = adler(data, 0, data.length);
|
|
512
|
+
buf[off + 0] = (crc >>> 24) & 255;
|
|
513
|
+
buf[off + 1] = (crc >>> 16) & 255;
|
|
514
|
+
buf[off + 2] = (crc >>> 8) & 255;
|
|
515
|
+
buf[off + 3] = (crc >>> 0) & 255;
|
|
516
|
+
return new Uint8Array(buf.buffer, 0, off + 4);
|
|
517
|
+
}
|
|
518
|
+
function deflateRaw(data, opts) {
|
|
519
|
+
if (opts == null) opts = { level: 6 };
|
|
520
|
+
var buf = new Uint8Array(50 + Math.floor(data.length * 1.1));
|
|
521
|
+
var off = UZIP["F"]["deflateRaw"](data, buf, off, opts["level"]);
|
|
522
|
+
return new Uint8Array(buf.buffer, 0, off);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function encode(obj, noCmpr) {
|
|
526
|
+
if (noCmpr == null) noCmpr = false;
|
|
527
|
+
var tot = 0,
|
|
528
|
+
wUi = B.writeUint,
|
|
529
|
+
wUs = B.writeUshort;
|
|
530
|
+
var zpd = {};
|
|
531
|
+
for (var p in obj) {
|
|
532
|
+
var cpr = !_noNeed(p) && !noCmpr,
|
|
533
|
+
buf = obj[p],
|
|
534
|
+
cr = crc.crc(buf, 0, buf.length);
|
|
535
|
+
zpd[p] = {
|
|
536
|
+
cpr: cpr,
|
|
537
|
+
usize: buf.length,
|
|
538
|
+
crc: cr,
|
|
539
|
+
file: cpr ? deflateRaw(buf) : buf,
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
for (var p in zpd) tot += zpd[p].file.length + 30 + 46 + 2 * B.sizeUTF8(p);
|
|
544
|
+
tot += 22;
|
|
545
|
+
|
|
546
|
+
var data = new Uint8Array(tot),
|
|
547
|
+
o = 0;
|
|
548
|
+
var fof = [];
|
|
549
|
+
|
|
550
|
+
for (var p in zpd) {
|
|
551
|
+
var file = zpd[p];
|
|
552
|
+
fof.push(o);
|
|
553
|
+
o = _writeHeader(data, o, p, file, 0);
|
|
554
|
+
}
|
|
555
|
+
var i = 0,
|
|
556
|
+
ioff = o;
|
|
557
|
+
for (var p in zpd) {
|
|
558
|
+
var file = zpd[p];
|
|
559
|
+
fof.push(o);
|
|
560
|
+
o = _writeHeader(data, o, p, file, 1, fof[i++]);
|
|
561
|
+
}
|
|
562
|
+
var csize = o - ioff;
|
|
563
|
+
|
|
564
|
+
wUi(data, o, 0x06054b50);
|
|
565
|
+
o += 4;
|
|
566
|
+
o += 4; // disks
|
|
567
|
+
wUs(data, o, i);
|
|
568
|
+
o += 2;
|
|
569
|
+
wUs(data, o, i);
|
|
570
|
+
o += 2; // number of c d records
|
|
571
|
+
wUi(data, o, csize);
|
|
572
|
+
o += 4;
|
|
573
|
+
wUi(data, o, ioff);
|
|
574
|
+
o += 4;
|
|
575
|
+
o += 2;
|
|
576
|
+
return data.buffer;
|
|
577
|
+
}
|
|
578
|
+
// no need to compress .PNG, .ZIP, .JPEG ....
|
|
579
|
+
function _noNeed(fn) {
|
|
580
|
+
var ext = fn.split(".").pop().toLowerCase();
|
|
581
|
+
return "png,jpg,jpeg,zip".indexOf(ext) != -1;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function _writeHeader(data, o, p, obj, t, roff) {
|
|
585
|
+
// it is a task of a user to provide valid file names
|
|
586
|
+
//var bad = "#%&{}\<>*?$'\":@+`|=";
|
|
587
|
+
//for(var i=0; i<p.length; i++) if(bad.indexOf(p[i])!=-1) p = p.slice(0,i)+"_"+p.slice(i+1);
|
|
588
|
+
|
|
589
|
+
var wUi = B.writeUint,
|
|
590
|
+
wUs = B.writeUshort;
|
|
591
|
+
var file = obj.file;
|
|
592
|
+
|
|
593
|
+
wUi(data, o, t == 0 ? 0x04034b50 : 0x02014b50);
|
|
594
|
+
o += 4; // sign
|
|
595
|
+
if (t == 1) o += 2; // ver made by
|
|
596
|
+
wUs(data, o, 20);
|
|
597
|
+
o += 2; // ver
|
|
598
|
+
wUs(data, o, 2048);
|
|
599
|
+
o += 2; // gflip
|
|
600
|
+
wUs(data, o, obj.cpr ? 8 : 0);
|
|
601
|
+
o += 2; // cmpr
|
|
602
|
+
|
|
603
|
+
_writeTime(data, o, Date.now());
|
|
604
|
+
o += 4; //wUi(data, o, 0); o+=4; // time
|
|
605
|
+
wUi(data, o, obj.crc);
|
|
606
|
+
o += 4; // crc32
|
|
607
|
+
wUi(data, o, file.length);
|
|
608
|
+
o += 4; // csize
|
|
609
|
+
wUi(data, o, obj.usize);
|
|
610
|
+
o += 4; // usize
|
|
611
|
+
|
|
612
|
+
wUs(data, o, B.sizeUTF8(p));
|
|
613
|
+
o += 2; // nlen
|
|
614
|
+
wUs(data, o, 0);
|
|
615
|
+
o += 2; // elen
|
|
616
|
+
|
|
617
|
+
if (t == 1) {
|
|
618
|
+
o += 2; // comment length
|
|
619
|
+
o += 2; // disk number
|
|
620
|
+
o += 6; // attributes
|
|
621
|
+
wUi(data, o, roff);
|
|
622
|
+
o += 4; // usize
|
|
623
|
+
}
|
|
624
|
+
var nlen = B.writeUTF8(data, o, p);
|
|
625
|
+
o += nlen;
|
|
626
|
+
if (t == 0) {
|
|
627
|
+
data.set(file, o);
|
|
628
|
+
o += file.length;
|
|
629
|
+
}
|
|
630
|
+
return o;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
UZIP["crc"] = crc;
|
|
634
|
+
UZIP["adler"] = adler;
|
|
635
|
+
|
|
636
|
+
UZIP["inflate"] = inflate;
|
|
637
|
+
UZIP["inflateRaw"] = inflateRaw;
|
|
638
|
+
UZIP["deflate"] = deflate;
|
|
639
|
+
UZIP["deflateRaw"] = deflateRaw;
|
|
640
|
+
UZIP["parse"] = parse;
|
|
641
|
+
UZIP["encode"] = encode;
|
|
642
|
+
})();
|
|
643
|
+
|
|
644
|
+
(function () {
|
|
645
|
+
var U = (function () {
|
|
646
|
+
var u16 = Uint16Array,
|
|
647
|
+
u32 = Uint32Array;
|
|
648
|
+
return {
|
|
649
|
+
next_code: new u16(16),
|
|
650
|
+
bl_count: new u16(16),
|
|
651
|
+
ordr: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
|
|
652
|
+
of0: [
|
|
653
|
+
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
|
|
654
|
+
67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999,
|
|
655
|
+
],
|
|
656
|
+
exb: [
|
|
657
|
+
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,
|
|
658
|
+
5, 5, 5, 5, 0, 0, 0, 0,
|
|
659
|
+
],
|
|
660
|
+
ldef: new u16(32),
|
|
661
|
+
df0: [
|
|
662
|
+
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385,
|
|
663
|
+
513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577,
|
|
664
|
+
65535, 65535,
|
|
665
|
+
],
|
|
666
|
+
dxb: [
|
|
667
|
+
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
|
|
668
|
+
10, 11, 11, 12, 12, 13, 13, 0, 0,
|
|
669
|
+
],
|
|
670
|
+
ddef: new u32(32),
|
|
671
|
+
flmap: new u16(512),
|
|
672
|
+
fltree: [],
|
|
673
|
+
fdmap: new u16(32),
|
|
674
|
+
fdtree: [],
|
|
675
|
+
lmap: new u16(32768),
|
|
676
|
+
ltree: [],
|
|
677
|
+
ttree: [],
|
|
678
|
+
dmap: new u16(32768),
|
|
679
|
+
dtree: [],
|
|
680
|
+
imap: new u16(512),
|
|
681
|
+
itree: [],
|
|
682
|
+
//rev9 : new u16( 512)
|
|
683
|
+
rev15: new u16(1 << 15),
|
|
684
|
+
lhst: new u32(286),
|
|
685
|
+
dhst: new u32(30),
|
|
686
|
+
ihst: new u32(19),
|
|
687
|
+
lits: new u32(15000),
|
|
688
|
+
strt: new u16(1 << 16),
|
|
689
|
+
prev: new u16(1 << 15),
|
|
690
|
+
};
|
|
691
|
+
})();
|
|
692
|
+
|
|
693
|
+
function makeCodes(tree, MAX_BITS) {
|
|
694
|
+
// code, length
|
|
695
|
+
var max_code = tree.length;
|
|
696
|
+
var code, bits, n, i, len;
|
|
697
|
+
|
|
698
|
+
var bl_count = U.bl_count;
|
|
699
|
+
for (var i = 0; i <= MAX_BITS; i++) bl_count[i] = 0;
|
|
700
|
+
for (i = 1; i < max_code; i += 2) bl_count[tree[i]]++;
|
|
701
|
+
|
|
702
|
+
var next_code = U.next_code; // smallest code for each length
|
|
703
|
+
|
|
704
|
+
code = 0;
|
|
705
|
+
bl_count[0] = 0;
|
|
706
|
+
for (bits = 1; bits <= MAX_BITS; bits++) {
|
|
707
|
+
code = (code + bl_count[bits - 1]) << 1;
|
|
708
|
+
next_code[bits] = code;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
for (n = 0; n < max_code; n += 2) {
|
|
712
|
+
len = tree[n + 1];
|
|
713
|
+
if (len != 0) {
|
|
714
|
+
tree[n] = next_code[len];
|
|
715
|
+
next_code[len]++;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
function codes2map(tree, MAX_BITS, map) {
|
|
720
|
+
var max_code = tree.length;
|
|
721
|
+
var r15 = U.rev15;
|
|
722
|
+
for (var i = 0; i < max_code; i += 2)
|
|
723
|
+
if (tree[i + 1] != 0) {
|
|
724
|
+
var lit = i >> 1;
|
|
725
|
+
var cl = tree[i + 1],
|
|
726
|
+
val = (lit << 4) | cl; // : (0x8000 | (U.of0[lit-257]<<7) | (U.exb[lit-257]<<4) | cl);
|
|
727
|
+
var rest = MAX_BITS - cl,
|
|
728
|
+
i0 = tree[i] << rest,
|
|
729
|
+
i1 = i0 + (1 << rest);
|
|
730
|
+
//tree[i]=r15[i0]>>>(15-MAX_BITS);
|
|
731
|
+
while (i0 != i1) {
|
|
732
|
+
var p0 = r15[i0] >>> (15 - MAX_BITS);
|
|
733
|
+
map[p0] = val;
|
|
734
|
+
i0++;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
function revCodes(tree, MAX_BITS) {
|
|
739
|
+
var r15 = U.rev15,
|
|
740
|
+
imb = 15 - MAX_BITS;
|
|
741
|
+
for (var i = 0; i < tree.length; i += 2) {
|
|
742
|
+
var i0 = tree[i] << (MAX_BITS - tree[i + 1]);
|
|
743
|
+
tree[i] = r15[i0] >>> imb;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// used only in deflate
|
|
748
|
+
function _putsE(dt, pos, val) {
|
|
749
|
+
val = val << (pos & 7);
|
|
750
|
+
var o = pos >>> 3;
|
|
751
|
+
dt[o] |= val;
|
|
752
|
+
dt[o + 1] |= val >>> 8;
|
|
753
|
+
}
|
|
754
|
+
function _putsF(dt, pos, val) {
|
|
755
|
+
val = val << (pos & 7);
|
|
756
|
+
var o = pos >>> 3;
|
|
757
|
+
dt[o] |= val;
|
|
758
|
+
dt[o + 1] |= val >>> 8;
|
|
759
|
+
dt[o + 2] |= val >>> 16;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
function _bitsE(dt, pos, length) {
|
|
763
|
+
return (
|
|
764
|
+
((dt[pos >>> 3] | (dt[(pos >>> 3) + 1] << 8)) >>> (pos & 7)) &
|
|
765
|
+
((1 << length) - 1)
|
|
766
|
+
);
|
|
767
|
+
}
|
|
768
|
+
function _bitsF(dt, pos, length) {
|
|
769
|
+
return (
|
|
770
|
+
((dt[pos >>> 3] |
|
|
771
|
+
(dt[(pos >>> 3) + 1] << 8) |
|
|
772
|
+
(dt[(pos >>> 3) + 2] << 16)) >>>
|
|
773
|
+
(pos & 7)) &
|
|
774
|
+
((1 << length) - 1)
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
function _get17(dt, pos) {
|
|
779
|
+
// return at least 17 meaningful bytes
|
|
780
|
+
return (
|
|
781
|
+
(dt[pos >>> 3] |
|
|
782
|
+
(dt[(pos >>> 3) + 1] << 8) |
|
|
783
|
+
(dt[(pos >>> 3) + 2] << 16)) >>>
|
|
784
|
+
(pos & 7)
|
|
785
|
+
);
|
|
786
|
+
}
|
|
787
|
+
function _get25(dt, pos) {
|
|
788
|
+
// return at least 17 meaningful bytes
|
|
789
|
+
return (
|
|
790
|
+
(dt[pos >>> 3] |
|
|
791
|
+
(dt[(pos >>> 3) + 1] << 8) |
|
|
792
|
+
(dt[(pos >>> 3) + 2] << 16) |
|
|
793
|
+
(dt[(pos >>> 3) + 3] << 24)) >>>
|
|
794
|
+
(pos & 7)
|
|
795
|
+
);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
(function () {
|
|
799
|
+
var len = 1 << 15;
|
|
800
|
+
for (var i = 0; i < len; i++) {
|
|
801
|
+
var x = i;
|
|
802
|
+
x = ((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1);
|
|
803
|
+
x = ((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2);
|
|
804
|
+
x = ((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4);
|
|
805
|
+
x = ((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8);
|
|
806
|
+
U.rev15[i] = ((x >>> 16) | (x << 16)) >>> 17;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function pushV(tgt, n, sv) {
|
|
810
|
+
while (n-- != 0) tgt.push(0, sv);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
for (var i = 0; i < 32; i++) {
|
|
814
|
+
U.ldef[i] = (U.of0[i] << 3) | U.exb[i];
|
|
815
|
+
U.ddef[i] = (U.df0[i] << 4) | U.dxb[i];
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
pushV(U.fltree, 144, 8);
|
|
819
|
+
pushV(U.fltree, 255 - 143, 9);
|
|
820
|
+
pushV(U.fltree, 279 - 255, 7);
|
|
821
|
+
pushV(U.fltree, 287 - 279, 8);
|
|
822
|
+
/*
|
|
823
|
+
var i = 0;
|
|
824
|
+
for(; i<=143; i++) U.fltree.push(0,8);
|
|
825
|
+
for(; i<=255; i++) U.fltree.push(0,9);
|
|
826
|
+
for(; i<=279; i++) U.fltree.push(0,7);
|
|
827
|
+
for(; i<=287; i++) U.fltree.push(0,8);
|
|
828
|
+
*/
|
|
829
|
+
makeCodes(U.fltree, 9);
|
|
830
|
+
codes2map(U.fltree, 9, U.flmap);
|
|
831
|
+
revCodes(U.fltree, 9);
|
|
832
|
+
|
|
833
|
+
pushV(U.fdtree, 32, 5);
|
|
834
|
+
//for(i=0;i<32; i++) U.fdtree.push(0,5);
|
|
835
|
+
makeCodes(U.fdtree, 5);
|
|
836
|
+
codes2map(U.fdtree, 5, U.fdmap);
|
|
837
|
+
revCodes(U.fdtree, 5);
|
|
838
|
+
|
|
839
|
+
pushV(U.itree, 19, 0);
|
|
840
|
+
pushV(U.ltree, 286, 0);
|
|
841
|
+
pushV(U.dtree, 30, 0);
|
|
842
|
+
pushV(U.ttree, 320, 0);
|
|
843
|
+
/*
|
|
844
|
+
for(var i=0; i< 19; i++) U.itree.push(0,0);
|
|
845
|
+
for(var i=0; i<286; i++) U.ltree.push(0,0);
|
|
846
|
+
for(var i=0; i< 30; i++) U.dtree.push(0,0);
|
|
847
|
+
for(var i=0; i<320; i++) U.ttree.push(0,0);
|
|
848
|
+
*/
|
|
849
|
+
})();
|
|
850
|
+
|
|
851
|
+
function deflateRaw(data, out, opos, lvl) {
|
|
852
|
+
var opts = [
|
|
853
|
+
/*
|
|
854
|
+
ush good_length; /* reduce lazy search above this match length
|
|
855
|
+
ush max_lazy; /* do not perform lazy search above this match length
|
|
856
|
+
ush nice_length; /* quit search above this match length
|
|
857
|
+
*/
|
|
858
|
+
/* good lazy nice chain */
|
|
859
|
+
/* 0 */ [0, 0, 0, 0, 0] /* store only */,
|
|
860
|
+
/* 1 */ [4, 4, 8, 4, 0] /* max speed, no lazy matches */,
|
|
861
|
+
/* 2 */ [4, 5, 16, 8, 0],
|
|
862
|
+
/* 3 */ [4, 6, 16, 16, 0],
|
|
863
|
+
|
|
864
|
+
/* 4 */ [4, 10, 16, 32, 0] /* lazy matches */,
|
|
865
|
+
/* 5 */ [8, 16, 32, 32, 0],
|
|
866
|
+
/* 6 */ [8, 16, 128, 128, 0],
|
|
867
|
+
/* 7 */ [8, 32, 128, 256, 0],
|
|
868
|
+
/* 8 */ [32, 128, 258, 1024, 1],
|
|
869
|
+
/* 9 */ [32, 258, 258, 4096, 1],
|
|
870
|
+
]; /* max compression */
|
|
871
|
+
|
|
872
|
+
var opt = opts[lvl];
|
|
873
|
+
|
|
874
|
+
//var U = UZIP.F.U, goodIndex = UZIP.F._goodIndex, hash = UZIP.F._hash, putsE = UZIP.F._putsE;
|
|
875
|
+
var i = 0,
|
|
876
|
+
pos = opos << 3,
|
|
877
|
+
cvrd = 0,
|
|
878
|
+
dlen = data.length;
|
|
879
|
+
|
|
880
|
+
if (lvl == 0) {
|
|
881
|
+
while (i < dlen) {
|
|
882
|
+
var len = Math.min(0xffff, dlen - i);
|
|
883
|
+
_putsE(out, pos, i + len == dlen ? 1 : 0);
|
|
884
|
+
pos = _copyExact(data, i, len, out, pos + 8);
|
|
885
|
+
i += len;
|
|
886
|
+
}
|
|
887
|
+
return pos >>> 3;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
var lits = U.lits,
|
|
891
|
+
strt = U.strt,
|
|
892
|
+
prev = U.prev,
|
|
893
|
+
li = 0,
|
|
894
|
+
lc = 0,
|
|
895
|
+
bs = 0,
|
|
896
|
+
ebits = 0,
|
|
897
|
+
c = 0,
|
|
898
|
+
nc = 0; // last_item, literal_count, block_start
|
|
899
|
+
if (dlen > 2) {
|
|
900
|
+
nc = _hash(data, 0);
|
|
901
|
+
strt[nc] = 0;
|
|
902
|
+
}
|
|
903
|
+
var nmch = 0,
|
|
904
|
+
nmci = 0;
|
|
905
|
+
|
|
906
|
+
for (i = 0; i < dlen; i++) {
|
|
907
|
+
c = nc;
|
|
908
|
+
//*
|
|
909
|
+
if (i + 1 < dlen - 2) {
|
|
910
|
+
nc = _hash(data, i + 1);
|
|
911
|
+
var ii = (i + 1) & 0x7fff;
|
|
912
|
+
prev[ii] = strt[nc];
|
|
913
|
+
strt[nc] = ii;
|
|
914
|
+
} //*/
|
|
915
|
+
if (cvrd <= i) {
|
|
916
|
+
if ((li > 14000 || lc > 26697) && dlen - i > 100) {
|
|
917
|
+
if (cvrd < i) {
|
|
918
|
+
lits[li] = i - cvrd;
|
|
919
|
+
li += 2;
|
|
920
|
+
cvrd = i;
|
|
921
|
+
}
|
|
922
|
+
pos = _writeBlock(
|
|
923
|
+
i == dlen - 1 || cvrd == dlen ? 1 : 0,
|
|
924
|
+
lits,
|
|
925
|
+
li,
|
|
926
|
+
ebits,
|
|
927
|
+
data,
|
|
928
|
+
bs,
|
|
929
|
+
i - bs,
|
|
930
|
+
out,
|
|
931
|
+
pos,
|
|
932
|
+
);
|
|
933
|
+
li = lc = ebits = 0;
|
|
934
|
+
bs = i;
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
var mch = 0;
|
|
938
|
+
//if(nmci==i) mch= nmch; else
|
|
939
|
+
if (i < dlen - 2)
|
|
940
|
+
mch = _bestMatch(
|
|
941
|
+
data,
|
|
942
|
+
i,
|
|
943
|
+
prev,
|
|
944
|
+
c,
|
|
945
|
+
Math.min(opt[2], dlen - i),
|
|
946
|
+
opt[3],
|
|
947
|
+
);
|
|
948
|
+
/*
|
|
949
|
+
if(mch!=0 && opt[4]==1 && (mch>>>16)<opt[1] && i+1<dlen-2) {
|
|
950
|
+
nmch = UZIP.F._bestMatch(data, i+1, prev, nc, opt[2], opt[3]); nmci=i+1;
|
|
951
|
+
//var mch2 = UZIP.F._bestMatch(data, i+2, prev, nnc); //nmci=i+1;
|
|
952
|
+
if((nmch>>>16)>(mch>>>16)) mch=0;
|
|
953
|
+
}//*/
|
|
954
|
+
var len = mch >>> 16,
|
|
955
|
+
dst = mch & 0xffff; //if(i-dst<0) throw "e";
|
|
956
|
+
if (mch != 0) {
|
|
957
|
+
var len = mch >>> 16,
|
|
958
|
+
dst = mch & 0xffff; //if(i-dst<0) throw "e";
|
|
959
|
+
var lgi = _goodIndex(len, U.of0);
|
|
960
|
+
U.lhst[257 + lgi]++;
|
|
961
|
+
var dgi = _goodIndex(dst, U.df0);
|
|
962
|
+
U.dhst[dgi]++;
|
|
963
|
+
ebits += U.exb[lgi] + U.dxb[dgi];
|
|
964
|
+
lits[li] = (len << 23) | (i - cvrd);
|
|
965
|
+
lits[li + 1] = (dst << 16) | (lgi << 8) | dgi;
|
|
966
|
+
li += 2;
|
|
967
|
+
cvrd = i + len;
|
|
968
|
+
} else {
|
|
969
|
+
U.lhst[data[i]]++;
|
|
970
|
+
}
|
|
971
|
+
lc++;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
if (bs != i || data.length == 0) {
|
|
975
|
+
if (cvrd < i) {
|
|
976
|
+
lits[li] = i - cvrd;
|
|
977
|
+
li += 2;
|
|
978
|
+
cvrd = i;
|
|
979
|
+
}
|
|
980
|
+
pos = _writeBlock(1, lits, li, ebits, data, bs, i - bs, out, pos);
|
|
981
|
+
li = 0;
|
|
982
|
+
lc = 0;
|
|
983
|
+
li = lc = ebits = 0;
|
|
984
|
+
bs = i;
|
|
985
|
+
}
|
|
986
|
+
while ((pos & 7) != 0) pos++;
|
|
987
|
+
return pos >>> 3;
|
|
988
|
+
}
|
|
989
|
+
function _bestMatch(data, i, prev, c, nice, chain) {
|
|
990
|
+
var ci = i & 0x7fff,
|
|
991
|
+
pi = prev[ci];
|
|
992
|
+
//console.log("----", i);
|
|
993
|
+
var dif = (ci - pi + (1 << 15)) & 0x7fff;
|
|
994
|
+
if (pi == ci || c != _hash(data, i - dif)) return 0;
|
|
995
|
+
var tl = 0,
|
|
996
|
+
td = 0; // top length, top distance
|
|
997
|
+
var dlim = Math.min(0x7fff, i);
|
|
998
|
+
while (
|
|
999
|
+
dif <= dlim &&
|
|
1000
|
+
--chain != 0 &&
|
|
1001
|
+
pi != ci /*&& c==UZIP.F._hash(data,i-dif)*/
|
|
1002
|
+
) {
|
|
1003
|
+
if (tl == 0 || data[i + tl] == data[i + tl - dif]) {
|
|
1004
|
+
var cl = _howLong(data, i, dif);
|
|
1005
|
+
if (cl > tl) {
|
|
1006
|
+
tl = cl;
|
|
1007
|
+
td = dif;
|
|
1008
|
+
if (tl >= nice) break; //*
|
|
1009
|
+
if (dif + 2 < cl) cl = dif + 2;
|
|
1010
|
+
var maxd = 0; // pi does not point to the start of the word
|
|
1011
|
+
for (var j = 0; j < cl - 2; j++) {
|
|
1012
|
+
var ei = (i - dif + j + (1 << 15)) & 0x7fff;
|
|
1013
|
+
var li = prev[ei];
|
|
1014
|
+
var curd = (ei - li + (1 << 15)) & 0x7fff;
|
|
1015
|
+
if (curd > maxd) {
|
|
1016
|
+
maxd = curd;
|
|
1017
|
+
pi = ei;
|
|
1018
|
+
}
|
|
1019
|
+
} //*/
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
ci = pi;
|
|
1024
|
+
pi = prev[ci];
|
|
1025
|
+
dif += (ci - pi + (1 << 15)) & 0x7fff;
|
|
1026
|
+
}
|
|
1027
|
+
return (tl << 16) | td;
|
|
1028
|
+
}
|
|
1029
|
+
function _howLong(data, i, dif) {
|
|
1030
|
+
if (
|
|
1031
|
+
data[i] != data[i - dif] ||
|
|
1032
|
+
data[i + 1] != data[i + 1 - dif] ||
|
|
1033
|
+
data[i + 2] != data[i + 2 - dif]
|
|
1034
|
+
)
|
|
1035
|
+
return 0;
|
|
1036
|
+
var oi = i,
|
|
1037
|
+
l = Math.min(data.length, i + 258);
|
|
1038
|
+
i += 3;
|
|
1039
|
+
//while(i+4<l && data[i]==data[i-dif] && data[i+1]==data[i+1-dif] && data[i+2]==data[i+2-dif] && data[i+3]==data[i+3-dif]) i+=4;
|
|
1040
|
+
while (i < l && data[i] == data[i - dif]) i++;
|
|
1041
|
+
return i - oi;
|
|
1042
|
+
}
|
|
1043
|
+
function _hash(data, i) {
|
|
1044
|
+
return (((data[i] << 8) | data[i + 1]) + (data[i + 2] << 4)) & 0xffff;
|
|
1045
|
+
//var hash_shift = 0, hash_mask = 255;
|
|
1046
|
+
//var h = data[i+1] % 251;
|
|
1047
|
+
//h = (((h << 8) + data[i+2]) % 251);
|
|
1048
|
+
//h = (((h << 8) + data[i+2]) % 251);
|
|
1049
|
+
//h = ((h<<hash_shift) ^ (c) ) & hash_mask;
|
|
1050
|
+
//return h | (data[i]<<8);
|
|
1051
|
+
//return (data[i] | (data[i+1]<<8));
|
|
1052
|
+
}
|
|
1053
|
+
//UZIP.___toth = 0;
|
|
1054
|
+
//UZIP.saved = 0;
|
|
1055
|
+
function _writeBlock(BFINAL, lits, li, ebits, data, o0, l0, out, pos) {
|
|
1056
|
+
//var U = UZIP.F.U, putsF = UZIP.F._putsF, putsE = UZIP.F._putsE;
|
|
1057
|
+
|
|
1058
|
+
//*
|
|
1059
|
+
var T, ML, MD, MH, numl, numd, numh, lset, dset;
|
|
1060
|
+
U.lhst[256]++;
|
|
1061
|
+
T = getTrees();
|
|
1062
|
+
ML = T[0];
|
|
1063
|
+
MD = T[1];
|
|
1064
|
+
MH = T[2];
|
|
1065
|
+
numl = T[3];
|
|
1066
|
+
numd = T[4];
|
|
1067
|
+
numh = T[5];
|
|
1068
|
+
lset = T[6];
|
|
1069
|
+
dset = T[7];
|
|
1070
|
+
|
|
1071
|
+
var cstSize =
|
|
1072
|
+
(((pos + 3) & 7) == 0 ? 0 : 8 - ((pos + 3) & 7)) + 32 + (l0 << 3);
|
|
1073
|
+
var fxdSize =
|
|
1074
|
+
ebits + contSize(U.fltree, U.lhst) + contSize(U.fdtree, U.dhst);
|
|
1075
|
+
var dynSize = ebits + contSize(U.ltree, U.lhst) + contSize(U.dtree, U.dhst);
|
|
1076
|
+
dynSize +=
|
|
1077
|
+
14 +
|
|
1078
|
+
3 * numh +
|
|
1079
|
+
contSize(U.itree, U.ihst) +
|
|
1080
|
+
(U.ihst[16] * 2 + U.ihst[17] * 3 + U.ihst[18] * 7);
|
|
1081
|
+
|
|
1082
|
+
for (var j = 0; j < 286; j++) U.lhst[j] = 0;
|
|
1083
|
+
for (var j = 0; j < 30; j++) U.dhst[j] = 0;
|
|
1084
|
+
for (var j = 0; j < 19; j++) U.ihst[j] = 0;
|
|
1085
|
+
//*/
|
|
1086
|
+
var BTYPE =
|
|
1087
|
+
cstSize < fxdSize && cstSize < dynSize ? 0 : fxdSize < dynSize ? 1 : 2;
|
|
1088
|
+
_putsF(out, pos, BFINAL);
|
|
1089
|
+
_putsF(out, pos + 1, BTYPE);
|
|
1090
|
+
pos += 3;
|
|
1091
|
+
|
|
1092
|
+
var opos = pos;
|
|
1093
|
+
if (BTYPE == 0) {
|
|
1094
|
+
while ((pos & 7) != 0) pos++;
|
|
1095
|
+
pos = _copyExact(data, o0, l0, out, pos);
|
|
1096
|
+
} else {
|
|
1097
|
+
var ltree, dtree;
|
|
1098
|
+
if (BTYPE == 1) {
|
|
1099
|
+
ltree = U.fltree;
|
|
1100
|
+
dtree = U.fdtree;
|
|
1101
|
+
}
|
|
1102
|
+
if (BTYPE == 2) {
|
|
1103
|
+
makeCodes(U.ltree, ML);
|
|
1104
|
+
revCodes(U.ltree, ML);
|
|
1105
|
+
makeCodes(U.dtree, MD);
|
|
1106
|
+
revCodes(U.dtree, MD);
|
|
1107
|
+
makeCodes(U.itree, MH);
|
|
1108
|
+
revCodes(U.itree, MH);
|
|
1109
|
+
|
|
1110
|
+
ltree = U.ltree;
|
|
1111
|
+
dtree = U.dtree;
|
|
1112
|
+
|
|
1113
|
+
_putsE(out, pos, numl - 257);
|
|
1114
|
+
pos += 5; // 286
|
|
1115
|
+
_putsE(out, pos, numd - 1);
|
|
1116
|
+
pos += 5; // 30
|
|
1117
|
+
_putsE(out, pos, numh - 4);
|
|
1118
|
+
pos += 4; // 19
|
|
1119
|
+
|
|
1120
|
+
for (var i = 0; i < numh; i++)
|
|
1121
|
+
_putsE(out, pos + i * 3, U.itree[(U.ordr[i] << 1) + 1]);
|
|
1122
|
+
pos += 3 * numh;
|
|
1123
|
+
pos = _codeTiny(lset, U.itree, out, pos);
|
|
1124
|
+
pos = _codeTiny(dset, U.itree, out, pos);
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
var off = o0;
|
|
1128
|
+
for (var si = 0; si < li; si += 2) {
|
|
1129
|
+
var qb = lits[si],
|
|
1130
|
+
len = qb >>> 23,
|
|
1131
|
+
end = off + (qb & ((1 << 23) - 1));
|
|
1132
|
+
while (off < end) pos = _writeLit(data[off++], ltree, out, pos);
|
|
1133
|
+
|
|
1134
|
+
if (len != 0) {
|
|
1135
|
+
var qc = lits[si + 1],
|
|
1136
|
+
dst = qc >> 16,
|
|
1137
|
+
lgi = (qc >> 8) & 255,
|
|
1138
|
+
dgi = qc & 255;
|
|
1139
|
+
pos = _writeLit(257 + lgi, ltree, out, pos);
|
|
1140
|
+
_putsE(out, pos, len - U.of0[lgi]);
|
|
1141
|
+
pos += U.exb[lgi];
|
|
1142
|
+
|
|
1143
|
+
pos = _writeLit(dgi, dtree, out, pos);
|
|
1144
|
+
_putsF(out, pos, dst - U.df0[dgi]);
|
|
1145
|
+
pos += U.dxb[dgi];
|
|
1146
|
+
off += len;
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
pos = _writeLit(256, ltree, out, pos);
|
|
1150
|
+
}
|
|
1151
|
+
//console.log(pos-opos, fxdSize, dynSize, cstSize);
|
|
1152
|
+
return pos;
|
|
1153
|
+
}
|
|
1154
|
+
function _copyExact(data, off, len, out, pos) {
|
|
1155
|
+
var p8 = pos >>> 3;
|
|
1156
|
+
out[p8] = len;
|
|
1157
|
+
out[p8 + 1] = len >>> 8;
|
|
1158
|
+
out[p8 + 2] = 255 - out[p8];
|
|
1159
|
+
out[p8 + 3] = 255 - out[p8 + 1];
|
|
1160
|
+
p8 += 4;
|
|
1161
|
+
out.set(new Uint8Array(data.buffer, off, len), p8);
|
|
1162
|
+
//for(var i=0; i<len; i++) out[p8+i]=data[off+i];
|
|
1163
|
+
return pos + ((len + 4) << 3);
|
|
1164
|
+
}
|
|
1165
|
+
/*
|
|
1166
|
+
Interesting facts:
|
|
1167
|
+
- decompressed block can have bytes, which do not occur in a Huffman tree (copied from the previous block by reference)
|
|
1168
|
+
*/
|
|
1169
|
+
|
|
1170
|
+
function getTrees() {
|
|
1171
|
+
var ML = _hufTree(U.lhst, U.ltree, 15);
|
|
1172
|
+
var MD = _hufTree(U.dhst, U.dtree, 15);
|
|
1173
|
+
var lset = [],
|
|
1174
|
+
numl = _lenCodes(U.ltree, lset);
|
|
1175
|
+
var dset = [],
|
|
1176
|
+
numd = _lenCodes(U.dtree, dset);
|
|
1177
|
+
for (var i = 0; i < lset.length; i += 2) U.ihst[lset[i]]++;
|
|
1178
|
+
for (var i = 0; i < dset.length; i += 2) U.ihst[dset[i]]++;
|
|
1179
|
+
var MH = _hufTree(U.ihst, U.itree, 7);
|
|
1180
|
+
var numh = 19;
|
|
1181
|
+
while (numh > 4 && U.itree[(U.ordr[numh - 1] << 1) + 1] == 0) numh--;
|
|
1182
|
+
return [ML, MD, MH, numl, numd, numh, lset, dset];
|
|
1183
|
+
}
|
|
1184
|
+
function getSecond(a) {
|
|
1185
|
+
var b = [];
|
|
1186
|
+
for (var i = 0; i < a.length; i += 2) b.push(a[i + 1]);
|
|
1187
|
+
return b;
|
|
1188
|
+
}
|
|
1189
|
+
function nonZero(a) {
|
|
1190
|
+
var b = "";
|
|
1191
|
+
for (var i = 0; i < a.length; i += 2)
|
|
1192
|
+
if (a[i + 1] != 0) b += (i >> 1) + ",";
|
|
1193
|
+
return b;
|
|
1194
|
+
}
|
|
1195
|
+
function contSize(tree, hst) {
|
|
1196
|
+
var s = 0;
|
|
1197
|
+
for (var i = 0; i < hst.length; i++) s += hst[i] * tree[(i << 1) + 1];
|
|
1198
|
+
return s;
|
|
1199
|
+
}
|
|
1200
|
+
function _codeTiny(set, tree, out, pos) {
|
|
1201
|
+
for (var i = 0; i < set.length; i += 2) {
|
|
1202
|
+
var l = set[i],
|
|
1203
|
+
rst = set[i + 1]; //console.log(l, pos, tree[(l<<1)+1]);
|
|
1204
|
+
pos = _writeLit(l, tree, out, pos);
|
|
1205
|
+
var rsl = l == 16 ? 2 : l == 17 ? 3 : 7;
|
|
1206
|
+
if (l > 15) {
|
|
1207
|
+
_putsE(out, pos, rst, rsl);
|
|
1208
|
+
pos += rsl;
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
return pos;
|
|
1212
|
+
}
|
|
1213
|
+
function _lenCodes(tree, set) {
|
|
1214
|
+
var len = tree.length;
|
|
1215
|
+
while (len != 2 && tree[len - 1] == 0) len -= 2; // when no distances, keep one code with length 0
|
|
1216
|
+
for (var i = 0; i < len; i += 2) {
|
|
1217
|
+
var l = tree[i + 1],
|
|
1218
|
+
nxt = i + 3 < len ? tree[i + 3] : -1,
|
|
1219
|
+
nnxt = i + 5 < len ? tree[i + 5] : -1,
|
|
1220
|
+
prv = i == 0 ? -1 : tree[i - 1];
|
|
1221
|
+
if (l == 0 && nxt == l && nnxt == l) {
|
|
1222
|
+
var lz = i + 5;
|
|
1223
|
+
while (lz + 2 < len && tree[lz + 2] == l) lz += 2;
|
|
1224
|
+
var zc = Math.min((lz + 1 - i) >>> 1, 138);
|
|
1225
|
+
if (zc < 11) set.push(17, zc - 3);
|
|
1226
|
+
else set.push(18, zc - 11);
|
|
1227
|
+
i += zc * 2 - 2;
|
|
1228
|
+
} else if (l == prv && nxt == l && nnxt == l) {
|
|
1229
|
+
var lz = i + 5;
|
|
1230
|
+
while (lz + 2 < len && tree[lz + 2] == l) lz += 2;
|
|
1231
|
+
var zc = Math.min((lz + 1 - i) >>> 1, 6);
|
|
1232
|
+
set.push(16, zc - 3);
|
|
1233
|
+
i += zc * 2 - 2;
|
|
1234
|
+
} else set.push(l, 0);
|
|
1235
|
+
}
|
|
1236
|
+
return len >>> 1;
|
|
1237
|
+
}
|
|
1238
|
+
function _hufTree(hst, tree, MAXL) {
|
|
1239
|
+
var list = [],
|
|
1240
|
+
hl = hst.length,
|
|
1241
|
+
tl = tree.length,
|
|
1242
|
+
i = 0;
|
|
1243
|
+
for (i = 0; i < tl; i += 2) {
|
|
1244
|
+
tree[i] = 0;
|
|
1245
|
+
tree[i + 1] = 0;
|
|
1246
|
+
}
|
|
1247
|
+
for (i = 0; i < hl; i++) if (hst[i] != 0) list.push({ lit: i, f: hst[i] });
|
|
1248
|
+
var end = list.length,
|
|
1249
|
+
l2 = list.slice(0);
|
|
1250
|
+
if (end == 0) return 0; // empty histogram (usually for dist)
|
|
1251
|
+
if (end == 1) {
|
|
1252
|
+
var lit = list[0].lit,
|
|
1253
|
+
l2 = lit == 0 ? 1 : 0;
|
|
1254
|
+
tree[(lit << 1) + 1] = 1;
|
|
1255
|
+
tree[(l2 << 1) + 1] = 1;
|
|
1256
|
+
return 1;
|
|
1257
|
+
}
|
|
1258
|
+
list.sort(function (a, b) {
|
|
1259
|
+
return a.f - b.f;
|
|
1260
|
+
});
|
|
1261
|
+
var a = list[0],
|
|
1262
|
+
b = list[1],
|
|
1263
|
+
i0 = 0,
|
|
1264
|
+
i1 = 1,
|
|
1265
|
+
i2 = 2;
|
|
1266
|
+
list[0] = { lit: -1, f: a.f + b.f, l: a, r: b, d: 0 };
|
|
1267
|
+
while (i1 != end - 1) {
|
|
1268
|
+
if (i0 != i1 && (i2 == end || list[i0].f < list[i2].f)) {
|
|
1269
|
+
a = list[i0++];
|
|
1270
|
+
} else {
|
|
1271
|
+
a = list[i2++];
|
|
1272
|
+
}
|
|
1273
|
+
if (i0 != i1 && (i2 == end || list[i0].f < list[i2].f)) {
|
|
1274
|
+
b = list[i0++];
|
|
1275
|
+
} else {
|
|
1276
|
+
b = list[i2++];
|
|
1277
|
+
}
|
|
1278
|
+
list[i1++] = { lit: -1, f: a.f + b.f, l: a, r: b };
|
|
1279
|
+
}
|
|
1280
|
+
var maxl = setDepth(list[i1 - 1], 0);
|
|
1281
|
+
if (maxl > MAXL) {
|
|
1282
|
+
restrictDepth(l2, MAXL, maxl);
|
|
1283
|
+
maxl = MAXL;
|
|
1284
|
+
}
|
|
1285
|
+
for (i = 0; i < end; i++) tree[(l2[i].lit << 1) + 1] = l2[i].d;
|
|
1286
|
+
return maxl;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
function setDepth(t, d) {
|
|
1290
|
+
if (t.lit != -1) {
|
|
1291
|
+
t.d = d;
|
|
1292
|
+
return d;
|
|
1293
|
+
}
|
|
1294
|
+
return Math.max(setDepth(t.l, d + 1), setDepth(t.r, d + 1));
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
function restrictDepth(dps, MD, maxl) {
|
|
1298
|
+
var i = 0,
|
|
1299
|
+
bCost = 1 << (maxl - MD),
|
|
1300
|
+
dbt = 0;
|
|
1301
|
+
dps.sort(function (a, b) {
|
|
1302
|
+
return b.d == a.d ? a.f - b.f : b.d - a.d;
|
|
1303
|
+
});
|
|
1304
|
+
|
|
1305
|
+
for (i = 0; i < dps.length; i++)
|
|
1306
|
+
if (dps[i].d > MD) {
|
|
1307
|
+
var od = dps[i].d;
|
|
1308
|
+
dps[i].d = MD;
|
|
1309
|
+
dbt += bCost - (1 << (maxl - od));
|
|
1310
|
+
} else break;
|
|
1311
|
+
dbt = dbt >>> (maxl - MD);
|
|
1312
|
+
while (dbt > 0) {
|
|
1313
|
+
var od = dps[i].d;
|
|
1314
|
+
if (od < MD) {
|
|
1315
|
+
dps[i].d++;
|
|
1316
|
+
dbt -= 1 << (MD - od - 1);
|
|
1317
|
+
} else i++;
|
|
1318
|
+
}
|
|
1319
|
+
for (; i >= 0; i--)
|
|
1320
|
+
if (dps[i].d == MD && dbt < 0) {
|
|
1321
|
+
dps[i].d--;
|
|
1322
|
+
dbt++;
|
|
1323
|
+
}
|
|
1324
|
+
if (dbt != 0) console.log("debt left");
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
function _goodIndex(v, arr) {
|
|
1328
|
+
var i = 0;
|
|
1329
|
+
if (arr[i | 16] <= v) i |= 16;
|
|
1330
|
+
if (arr[i | 8] <= v) i |= 8;
|
|
1331
|
+
if (arr[i | 4] <= v) i |= 4;
|
|
1332
|
+
if (arr[i | 2] <= v) i |= 2;
|
|
1333
|
+
if (arr[i | 1] <= v) i |= 1;
|
|
1334
|
+
return i;
|
|
1335
|
+
}
|
|
1336
|
+
function _writeLit(ch, ltree, out, pos) {
|
|
1337
|
+
_putsF(out, pos, ltree[ch << 1]);
|
|
1338
|
+
return pos + ltree[(ch << 1) + 1];
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
function inflate(data, buf) {
|
|
1342
|
+
var u8 = Uint8Array;
|
|
1343
|
+
if (data[0] == 3 && data[1] == 0) return buf ? buf : new u8(0);
|
|
1344
|
+
//var F=UZIP.F, bitsF = F._bitsF, bitsE = F._bitsE, decodeTiny = F._decodeTiny, makeCodes = F.makeCodes, codes2map=F.codes2map, get17 = F._get17;
|
|
1345
|
+
|
|
1346
|
+
var noBuf = buf == null;
|
|
1347
|
+
if (noBuf) buf = new u8((data.length >>> 2) << 3);
|
|
1348
|
+
|
|
1349
|
+
var BFINAL = 0,
|
|
1350
|
+
BTYPE = 0,
|
|
1351
|
+
HLIT = 0,
|
|
1352
|
+
HDIST = 0,
|
|
1353
|
+
HCLEN = 0,
|
|
1354
|
+
ML = 0,
|
|
1355
|
+
MD = 0;
|
|
1356
|
+
var off = 0,
|
|
1357
|
+
pos = 0;
|
|
1358
|
+
var lmap, dmap;
|
|
1359
|
+
|
|
1360
|
+
while (BFINAL == 0) {
|
|
1361
|
+
BFINAL = _bitsF(data, pos, 1);
|
|
1362
|
+
BTYPE = _bitsF(data, pos + 1, 2);
|
|
1363
|
+
pos += 3;
|
|
1364
|
+
//console.log(BFINAL, BTYPE);
|
|
1365
|
+
|
|
1366
|
+
if (BTYPE == 0) {
|
|
1367
|
+
if ((pos & 7) != 0) pos += 8 - (pos & 7);
|
|
1368
|
+
var p8 = (pos >>> 3) + 4,
|
|
1369
|
+
len = data[p8 - 4] | (data[p8 - 3] << 8); //console.log(len);//bitsF(data, pos, 16),
|
|
1370
|
+
if (noBuf) buf = _check(buf, off + len);
|
|
1371
|
+
buf.set(new u8(data.buffer, data.byteOffset + p8, len), off);
|
|
1372
|
+
//for(var i=0; i<len; i++) buf[off+i] = data[p8+i];
|
|
1373
|
+
//for(var i=0; i<len; i++) if(buf[off+i] != data[p8+i]) throw "e";
|
|
1374
|
+
pos = (p8 + len) << 3;
|
|
1375
|
+
off += len;
|
|
1376
|
+
continue;
|
|
1377
|
+
}
|
|
1378
|
+
if (noBuf) buf = _check(buf, off + (1 << 17)); // really not enough in many cases (but PNG and ZIP provide buffer in advance)
|
|
1379
|
+
if (BTYPE == 1) {
|
|
1380
|
+
lmap = U.flmap;
|
|
1381
|
+
dmap = U.fdmap;
|
|
1382
|
+
ML = (1 << 9) - 1;
|
|
1383
|
+
MD = (1 << 5) - 1;
|
|
1384
|
+
}
|
|
1385
|
+
if (BTYPE == 2) {
|
|
1386
|
+
HLIT = _bitsE(data, pos, 5) + 257;
|
|
1387
|
+
HDIST = _bitsE(data, pos + 5, 5) + 1;
|
|
1388
|
+
HCLEN = _bitsE(data, pos + 10, 4) + 4;
|
|
1389
|
+
pos += 14;
|
|
1390
|
+
|
|
1391
|
+
var ppos = pos;
|
|
1392
|
+
for (var i = 0; i < 38; i += 2) {
|
|
1393
|
+
U.itree[i] = 0;
|
|
1394
|
+
U.itree[i + 1] = 0;
|
|
1395
|
+
}
|
|
1396
|
+
var tl = 1;
|
|
1397
|
+
for (var i = 0; i < HCLEN; i++) {
|
|
1398
|
+
var l = _bitsE(data, pos + i * 3, 3);
|
|
1399
|
+
U.itree[(U.ordr[i] << 1) + 1] = l;
|
|
1400
|
+
if (l > tl) tl = l;
|
|
1401
|
+
}
|
|
1402
|
+
pos += 3 * HCLEN; //console.log(itree);
|
|
1403
|
+
makeCodes(U.itree, tl);
|
|
1404
|
+
codes2map(U.itree, tl, U.imap);
|
|
1405
|
+
|
|
1406
|
+
lmap = U.lmap;
|
|
1407
|
+
dmap = U.dmap;
|
|
1408
|
+
|
|
1409
|
+
pos = _decodeTiny(
|
|
1410
|
+
U.imap,
|
|
1411
|
+
(1 << tl) - 1,
|
|
1412
|
+
HLIT + HDIST,
|
|
1413
|
+
data,
|
|
1414
|
+
pos,
|
|
1415
|
+
U.ttree,
|
|
1416
|
+
);
|
|
1417
|
+
var mx0 = _copyOut(U.ttree, 0, HLIT, U.ltree);
|
|
1418
|
+
ML = (1 << mx0) - 1;
|
|
1419
|
+
var mx1 = _copyOut(U.ttree, HLIT, HDIST, U.dtree);
|
|
1420
|
+
MD = (1 << mx1) - 1;
|
|
1421
|
+
|
|
1422
|
+
//var ml = _decodeTiny(U.imap, (1<<tl)-1, HLIT , data, pos, U.ltree); ML = (1<<(ml>>>24))-1; pos+=(ml&0xffffff);
|
|
1423
|
+
makeCodes(U.ltree, mx0);
|
|
1424
|
+
codes2map(U.ltree, mx0, lmap);
|
|
1425
|
+
|
|
1426
|
+
//var md = _decodeTiny(U.imap, (1<<tl)-1, HDIST, data, pos, U.dtree); MD = (1<<(md>>>24))-1; pos+=(md&0xffffff);
|
|
1427
|
+
makeCodes(U.dtree, mx1);
|
|
1428
|
+
codes2map(U.dtree, mx1, dmap);
|
|
1429
|
+
}
|
|
1430
|
+
//var ooff=off, opos=pos;
|
|
1431
|
+
while (true) {
|
|
1432
|
+
var code = lmap[_get17(data, pos) & ML];
|
|
1433
|
+
pos += code & 15;
|
|
1434
|
+
var lit = code >>> 4; //U.lhst[lit]++;
|
|
1435
|
+
if (lit >>> 8 == 0) {
|
|
1436
|
+
buf[off++] = lit;
|
|
1437
|
+
} else if (lit == 256) {
|
|
1438
|
+
break;
|
|
1439
|
+
} else {
|
|
1440
|
+
var end = off + lit - 254;
|
|
1441
|
+
if (lit > 264) {
|
|
1442
|
+
var ebs = U.ldef[lit - 257];
|
|
1443
|
+
end = off + (ebs >>> 3) + _bitsE(data, pos, ebs & 7);
|
|
1444
|
+
pos += ebs & 7;
|
|
1445
|
+
}
|
|
1446
|
+
//UZIP.F.dst[end-off]++;
|
|
1447
|
+
|
|
1448
|
+
var dcode = dmap[_get17(data, pos) & MD];
|
|
1449
|
+
pos += dcode & 15;
|
|
1450
|
+
var dlit = dcode >>> 4;
|
|
1451
|
+
var dbs = U.ddef[dlit],
|
|
1452
|
+
dst = (dbs >>> 4) + _bitsF(data, pos, dbs & 15);
|
|
1453
|
+
pos += dbs & 15;
|
|
1454
|
+
|
|
1455
|
+
//var o0 = off-dst, stp = Math.min(end-off, dst);
|
|
1456
|
+
//if(stp>20) while(off<end) { buf.copyWithin(off, o0, o0+stp); off+=stp; } else
|
|
1457
|
+
//if(end-dst<=off) buf.copyWithin(off, off-dst, end-dst); else
|
|
1458
|
+
//if(dst==1) buf.fill(buf[off-1], off, end); else
|
|
1459
|
+
if (noBuf) buf = _check(buf, off + (1 << 17));
|
|
1460
|
+
while (off < end) {
|
|
1461
|
+
buf[off] = buf[off++ - dst];
|
|
1462
|
+
buf[off] = buf[off++ - dst];
|
|
1463
|
+
buf[off] = buf[off++ - dst];
|
|
1464
|
+
buf[off] = buf[off++ - dst];
|
|
1465
|
+
}
|
|
1466
|
+
off = end;
|
|
1467
|
+
//while(off!=end) { buf[off]=buf[off++-dst]; }
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
//console.log(off-ooff, (pos-opos)>>>3);
|
|
1471
|
+
}
|
|
1472
|
+
//console.log(UZIP.F.dst);
|
|
1473
|
+
//console.log(tlen, dlen, off-tlen+tcnt);
|
|
1474
|
+
return buf.length == off ? buf : buf.slice(0, off);
|
|
1475
|
+
}
|
|
1476
|
+
function _check(buf, len) {
|
|
1477
|
+
var bl = buf.length;
|
|
1478
|
+
if (len <= bl) return buf;
|
|
1479
|
+
var nbuf = new Uint8Array(Math.max(bl << 1, len));
|
|
1480
|
+
nbuf.set(buf, 0);
|
|
1481
|
+
//for(var i=0; i<bl; i+=4) { nbuf[i]=buf[i]; nbuf[i+1]=buf[i+1]; nbuf[i+2]=buf[i+2]; nbuf[i+3]=buf[i+3]; }
|
|
1482
|
+
return nbuf;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
function _decodeTiny(lmap, LL, len, data, pos, tree) {
|
|
1486
|
+
//var bitsE = UZIP.F._bitsE, get17 = UZIP.F._get17;
|
|
1487
|
+
var i = 0;
|
|
1488
|
+
while (i < len) {
|
|
1489
|
+
var code = lmap[_get17(data, pos) & LL];
|
|
1490
|
+
pos += code & 15;
|
|
1491
|
+
var lit = code >>> 4;
|
|
1492
|
+
if (lit <= 15) {
|
|
1493
|
+
tree[i] = lit;
|
|
1494
|
+
i++;
|
|
1495
|
+
} else {
|
|
1496
|
+
var ll = 0,
|
|
1497
|
+
n = 0;
|
|
1498
|
+
if (lit == 16) {
|
|
1499
|
+
n = 3 + _bitsE(data, pos, 2);
|
|
1500
|
+
pos += 2;
|
|
1501
|
+
ll = tree[i - 1];
|
|
1502
|
+
} else if (lit == 17) {
|
|
1503
|
+
n = 3 + _bitsE(data, pos, 3);
|
|
1504
|
+
pos += 3;
|
|
1505
|
+
} else if (lit == 18) {
|
|
1506
|
+
n = 11 + _bitsE(data, pos, 7);
|
|
1507
|
+
pos += 7;
|
|
1508
|
+
}
|
|
1509
|
+
var ni = i + n;
|
|
1510
|
+
while (i < ni) {
|
|
1511
|
+
tree[i] = ll;
|
|
1512
|
+
i++;
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
return pos;
|
|
1517
|
+
}
|
|
1518
|
+
function _copyOut(src, off, len, tree) {
|
|
1519
|
+
var mx = 0,
|
|
1520
|
+
i = 0,
|
|
1521
|
+
tl = tree.length >>> 1;
|
|
1522
|
+
while (i < len) {
|
|
1523
|
+
var v = src[i + off];
|
|
1524
|
+
tree[i << 1] = 0;
|
|
1525
|
+
tree[(i << 1) + 1] = v;
|
|
1526
|
+
if (v > mx) mx = v;
|
|
1527
|
+
i++;
|
|
1528
|
+
}
|
|
1529
|
+
while (i < tl) {
|
|
1530
|
+
tree[i << 1] = 0;
|
|
1531
|
+
tree[(i << 1) + 1] = 0;
|
|
1532
|
+
i++;
|
|
1533
|
+
}
|
|
1534
|
+
return mx;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
UZIP["F"] = { inflate: inflate, deflateRaw: deflateRaw };
|
|
1538
|
+
})();
|