From aa18531282e713b0f27fa7386967cf7341fbe614 Mon Sep 17 00:00:00 2001 From: coomdev Date: Sat, 23 Jul 2022 15:30:46 +0200 Subject: [PATCH] Optimize JPG load times. Give option to disable loading on catalog --- README.md | 2 +- chrome/dist/main.js | 6321 ++++++++++++++++++----------------- chrome/manifest.json | 2 +- dist/main.js | 6323 ++++++++++++++++++----------------- firefox/dist/main.js | 6445 ++++++++++++++++++------------------ firefox/manifest.json | 2 +- firefox_update.json | 2 +- main.meta.js | 2 +- main.user.js | 6325 ++++++++++++++++++----------------- pngextraembedder-0.273.xpi | Bin 0 -> 507623 bytes src/Components/App.svelte | 9 +- src/jpg.ts | 72 +- src/main.ts | 44 +- src/stores.ts | 1 + 14 files changed, 12703 insertions(+), 12847 deletions(-) create mode 100644 pngextraembedder-0.273.xpi diff --git a/README.md b/README.md index f51a363..bf1eedb 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers) Also, use this if you plan to use b4k's archive. - [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js) -- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.271.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) +- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.273.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) For FF users, the extension is signed so you can just drag and drop it on your about:addons tab. diff --git a/chrome/dist/main.js b/chrome/dist/main.js index 57b1a37..7f9fc63 100644 --- a/chrome/dist/main.js +++ b/chrome/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,896 +10939,131 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, 161, 8, 35, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17824,1123 +16211,2712 @@ return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21226,7 +21202,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21290,11 +21266,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21700,8 +21676,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21777,7 +21753,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21814,12 +21790,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21863,70 +21839,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21936,80 +21911,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -22024,95 +21996,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22140,7 +22111,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22172,7 +22143,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22216,71 +22187,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22376,9 +22347,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22588,9 +22559,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22729,21 +22700,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22977,8 +22948,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23079,7 +23050,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23367,7 +23338,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23772,7 +23743,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26989,22 +26960,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -27054,6 +27029,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/chrome/manifest.json b/chrome/manifest.json index 2685137..c2c0b3d 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.270", + "version": "0.273", "icons": { "64": "1449696017588.png" }, diff --git a/dist/main.js b/dist/main.js index c389348..24bb519 100644 --- a/dist/main.js +++ b/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,897 +10939,132 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, 8, 35, 66, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17659,1123 +16046,2712 @@ return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21061,7 +21037,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21125,11 +21101,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21535,8 +21511,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21612,7 +21588,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21649,12 +21625,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21698,70 +21674,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21771,80 +21746,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -21859,95 +21831,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -21975,7 +21946,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22007,7 +21978,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22051,71 +22022,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22211,9 +22182,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22423,9 +22394,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22564,21 +22535,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22812,8 +22783,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -22914,7 +22885,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23202,7 +23173,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23607,7 +23578,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26824,22 +26795,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -26889,6 +26864,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/firefox/dist/main.js b/firefox/dist/main.js index c199959..80874da 100644 --- a/firefox/dist/main.js +++ b/firefox/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 271]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,896 +10939,131 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, 161, 8, 35, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17749,1175 +16136,2764 @@ mime: "application/x-esri-shape" }; } - if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { - await tokenizer.ignore(20); - const type = await tokenizer.readToken(new StringType(4, "ascii")); - switch (type) { - case "jp2 ": - return { - ext: "jp2", - mime: "image/jp2" - }; - case "jpx ": - return { - ext: "jpx", - mime: "image/jpx" - }; - case "jpm ": + if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { + await tokenizer.ignore(20); + const type = await tokenizer.readToken(new StringType(4, "ascii")); + switch (type) { + case "jp2 ": + return { + ext: "jp2", + mime: "image/jp2" + }; + case "jpx ": + return { + ext: "jpx", + mime: "image/jpx" + }; + case "jpm ": + return { + ext: "jpm", + mime: "image/jpm" + }; + case "mjp2": + return { + ext: "mj2", + mime: "image/mj2" + }; + default: + return; + } + } + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { + return { + ext: "lnk", + mime: "application/x.ms.shortcut" + }; + } + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { + return { + ext: "alias", + mime: "application/x.apple.alias" + }; + } + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { + return { + ext: "eot", + mime: "application/vnd.ms-fontobject" + }; + } + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { + return { + ext: "indd", + mime: "application/x-indesign" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { + return { + ext: "tar", + mime: "application/x-tar" + }; + } + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { + return { + ext: "skp", + mime: "application/vnd.sketchup.skp" + }; + } + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { + return { + ext: "pgp", + mime: "application/pgp-encrypted" + }; + } + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } + return { + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" + }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { return { - ext: "jpm", - mime: "image/jpm" + ext: "cr2", + mime: "image/x-canon-cr2" }; - case "mjp2": + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { return { - ext: "mj2", - mime: "image/mj2" + ext: "nef", + mime: "image/x-nikon-nef" }; - default: - return; + } } - } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { - return { - ext: "jxl", - mime: "image/jxl" - }; - } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { - return { - ext: "xml", - mime: "application/xml" - }; - } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { - return { - ext: "mpg", - mime: "video/mpeg" - }; - } - if (this.check([0, 1, 0, 0, 0])) { - return { - ext: "ttf", - mime: "font/ttf" - }; - } - if (this.check([0, 0, 1, 0])) { - return { - ext: "ico", - mime: "image/x-icon" + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" }; } - if (this.check([0, 0, 2, 0])) { + if (version === 43) { return { - ext: "cur", - mime: "image/x-icon" + ext: "tif", + mime: "image/tiff" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { - return { - ext: "cfb", - mime: "application/x-cfb" - }; + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFileFF = async (f) => { + let thumbnail = new Uint8Array(); + const te = new TextEncoder(); + thumbnail = await generateThumbnail(f); + const namebuf = te.encode(f.name); + const ret = new Uint8Array(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + const ret32 = new DataView(ret.buffer); + let ptr = 0; + ret.set(te.encode("PEE\0"), 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + ret.set(namebuf, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret32.setUint32(ptr, thumbnail.byteLength, true); + ptr += 4; + ret.set(thumbnail, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + ret.set(new Uint8Array(content), ptr); + return new Blob([ret]); + }; + var buildPeeFile = async (f) => { + if (true) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { - return { - ext: "vcf", - mime: "text/vcard" - }; + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); + } + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (true) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFileFF = async (f) => { - let thumbnail = new Uint8Array(); - const te = new TextEncoder(); - thumbnail = await generateThumbnail(f); - const namebuf = te.encode(f.name); - const ret = new Uint8Array(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - const ret32 = new DataView(ret.buffer); - let ptr = 0; - ret.set(te.encode("PEE\0"), 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - ret.set(namebuf, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret32.setUint32(ptr, thumbnail.byteLength, true); - ptr += 4; - ret.set(thumbnail, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - const content = await f.arrayBuffer(); - ret.set(new Uint8Array(content), ptr); - return new Blob([ret]); }; - var buildPeeFile = async (f) => { - if (true) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (true) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21203,7 +21179,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21267,11 +21243,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21677,8 +21653,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21754,7 +21730,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21791,12 +21767,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21840,70 +21816,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21913,80 +21888,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -22001,95 +21973,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22117,7 +22088,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22149,7 +22120,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22193,71 +22164,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22353,9 +22324,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22565,9 +22536,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22706,21 +22677,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22954,8 +22925,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23056,7 +23027,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23344,7 +23315,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23749,7 +23720,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26966,22 +26937,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -27031,6 +27006,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/firefox/manifest.json b/firefox/manifest.json index 37615ef..05a0f74 100644 --- a/firefox/manifest.json +++ b/firefox/manifest.json @@ -7,7 +7,7 @@ }, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.271", + "version": "0.273", "icons": { "64": "1449696017588.png" }, diff --git a/firefox_update.json b/firefox_update.json index f2ad8f4..6a4adb5 100644 --- a/firefox_update.json +++ b/firefox_update.json @@ -1 +1 @@ -{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.271","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.271.xpi"}]}}} \ No newline at end of file +{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.273","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.273.xpi"}]}}} \ No newline at end of file diff --git a/main.meta.js b/main.meta.js index 73b5a52..e8195f7 100644 --- a/main.meta.js +++ b/main.meta.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.270 +// @version 0.273 // @description uhh // @author You // @match https://boards.4channel.org/* diff --git a/main.user.js b/main.user.js index 03c943d..cdf4761 100644 --- a/main.user.js +++ b/main.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.270 +// @version 0.273 // @description uhh // @author You // @match https://boards.4channel.org/* @@ -66,6 +66,28 @@ const _DOMParser = DOMParser; __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -87,7 +109,7 @@ const _DOMParser = DOMParser; var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10953,897 +10975,132 @@ const _DOMParser = DOMParser; } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, 8, 35, 66, @@ -11983,7 +11240,11 @@ const _DOMParser = DOMParser; 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12147,1124 +11408,249 @@ const _DOMParser = DOMParser; 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13438,31 +11824,31 @@ const _DOMParser = DOMParser; writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13510,8 +11896,8 @@ const _DOMParser = DOMParser; writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13535,8 +11921,8 @@ const _DOMParser = DOMParser; nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13603,9 +11989,9 @@ const _DOMParser = DOMParser; UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15613,6 +13999,7 @@ const _DOMParser = DOMParser; xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17695,1123 +16082,2712 @@ const _DOMParser = DOMParser; return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21097,7 +21073,7 @@ const _DOMParser = DOMParser; // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21161,11 +21137,11 @@ const _DOMParser = DOMParser; hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21571,8 +21547,8 @@ const _DOMParser = DOMParser; if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21648,7 +21624,7 @@ const _DOMParser = DOMParser; c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21685,12 +21661,12 @@ const _DOMParser = DOMParser; input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21734,70 +21710,69 @@ const _DOMParser = DOMParser; let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21807,80 +21782,77 @@ const _DOMParser = DOMParser; c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -21895,95 +21867,94 @@ const _DOMParser = DOMParser; attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22011,7 +21982,7 @@ const _DOMParser = DOMParser; }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22043,7 +22014,7 @@ const _DOMParser = DOMParser; } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22087,71 +22058,71 @@ const _DOMParser = DOMParser; if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22247,9 +22218,9 @@ const _DOMParser = DOMParser; t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22459,9 +22430,9 @@ const _DOMParser = DOMParser; a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22600,21 +22571,21 @@ const _DOMParser = DOMParser; button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22848,8 +22819,8 @@ const _DOMParser = DOMParser; if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -22950,7 +22921,7 @@ const _DOMParser = DOMParser; for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23238,7 +23209,7 @@ const _DOMParser = DOMParser; t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23643,7 +23614,7 @@ const _DOMParser = DOMParser; const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26860,22 +26831,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -26925,6 +26900,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/pngextraembedder-0.273.xpi b/pngextraembedder-0.273.xpi new file mode 100644 index 0000000000000000000000000000000000000000..af8256e6e11d3142089910f1bf693906debcbb4d GIT binary patch literal 507623 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≫xbc{+1(y)B;!wD11K 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ⅆ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%0AbVKmzSN>+nG$bd*jC@B>< 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⪙uQ0s znz?WE<-hE9-*_4~xXF20=YD8+?z+5(eRwopexlA`Oobk;!%&J{7!f4}K!Ud_$rJXQ z9B9$%Vi5lZ{{ORdg2sg!-)!ccupY*7s73QfXpSQw0Lm~tV<&2lS5;Ohn5zx zREsaHn4pRWmht>vi&+en72`F+>|G+GW@4jen_3bjAi{-=vWyZYQ-?^*$7e{8qNxo) zyQj(^{g4nq&d(PE%OV8*c(+^@9{vs|tThch_W3g9Vkb}((F#YOuLUngDs2(sI=n{p zonkxihkfsWf3+=9emk`g8YW4Y=BscZ1xY?Z-Cj*Q)RdJJw}>iYGMU2%Zg3@Q+B-U_ z@eT`}3ZV;I!uEHs-F5>qTm0d=;L&v9Z8zb@EMVsK6NxWpWN==Nd18B!Mmv=ykT1C0 zTCia$aQEf?SLDL=*D&U}g2qyNRI_&e`O|8TgHl8v`ehqR*_K`Gdr&o1n2ttow8nix zKDLNggwvr`I`c`HL|YkQC+)qdrp8dq&Q{OZR-LmlGQ~L}-|Qgz30ch2grg_$sR}g_ zqM`X@IMdZv2f28M)f)>^bF70AQU0KLX<0aH-C$4=n}~I)iw{Q|kFWd7%3aQL?GT#k zExX%Riu17VZuNi>&Y*}jr(fHK3dGxUOM=XEH*>MS)O5%vq=SQ`Na6wQ zf$wQ)v$@fP!4+8S8>EFJH5Q_BA9Y%5IPY@B39B5FFHU*Y+qS+q`(CiY`#%NqZ|s4^ z`K+8vtbCctQu|>$Mics+6WBBUEPBdnr+!wI<;G(}WD?ktx@dK;ziwo>%Cuma=5)|E zIJ~NPcQaO+IN?TV{`k7IRQ6g$KF?aP-M4~)ZY^$HpHW|DS~yVuH1b}yk(exk-SRUh zlOZ$(>MoRcJp9Bu_A*D7NcmylMczp>-3_LOL9{LucP&P0_tWXhB076-1pBe3UupOq8F(v?Bj5uj`=7wO8|NCckPT`SjAuWYMH}yAoV#{SIi)2&NWodL3 zW*gTZ90ruUIlqB6Ufh5HmtP&9;IM_Rrcs3ohTBSYN@kewY47~CjITa@^2~<EmxLV2PGF*78_bNvI!R z_XzuQAsgPQU^zQ9e!wbcLe=1{)0JwE`5_)mvm{DX7^)0iCA0O!>Zd0@=%?;Q@u&mh zmAlGplwx@xM^PP}4^{P$F)^Q7yRCi-+8_B(B#<6&lYICh>VlVpG?R{h_uB;%(my<( z{`^wL59S0iBnd(udrkw49&9q{3?T(BNF;_6GSYpTP53oiH~Qydfd!tTi#7U8(;ym+sI)W-9?d%@RE zY+qV`4vGn#DcR@3yjPR>>4hMv`;~6-NpM>vkf`mQHVA7J zX6@qxMkH4}j+rn@&NwtKScSNAs|#L|yt%Llv!o&7^neR$Qt$Rui*B9La6#0OE?Cl7 zXb6*hzhNzKzxiE9<_i8>?){++Nt=M=voN+X-Fh33O)!l8$MzjosRB0S)T*STJM+=Dk|pm&2lU3(d){hBHbl zR<_w^JU0doHe)CcyNz}f-p%&3aQ#$S-;?<=O_*b=BS8D`po&dZt*i

FLKGMnrqb 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 literal 0 HcmV?d00001 diff --git a/src/Components/App.svelte b/src/Components/App.svelte index 339d921..ff64ec4 100644 --- a/src/Components/App.svelte +++ b/src/Components/App.svelte @@ -125,12 +125,8 @@ ? + + Disable loading on catalog

+iIR%?e6bhsGauzq)N=GRC1l+ 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�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