/* eslint-disable */
// gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js
(function e(t, n, r) {
  function s(o, u) {
    if (!n[o]) {
      if (!t[o]) {
        var a = typeof require == 'function' && require;
        if (!u && a) return a(o, !0);
        if (i) return i(o, !0);
        var f = new Error("Cannot find module '" + o + "'");
        throw ((f.code = 'MODULE_NOT_FOUND'), f);
      }
      var l = (n[o] = {
        exports: {},
      });
      t[o][0].call(
        l.exports,
        function (e) {
          var n = t[o][1][e];
          return s(n ? n : e);
        },
        l,
        l.exports,
        e,
        t,
        n,
        r
      );
    }
    return n[o].exports;
  }
  var i = typeof require == 'function' && require;
  for (var o = 0; o < r.length; o++) s(r[o]);
  return s;
})(
  {
    1: [
      function (require, module, exports) {
        var NeuQuant = require('./TypedNeuQuant.js');
        var LZWEncoder = require('./LZWEncoder.js');

        function ByteArray() {
          this.page = -1;
          this.pages = [];
          this.newPage();
        }
        ByteArray.pageSize = 4096;
        ByteArray.charMap = {};
        for (var i = 0; i < 256; i++)
          ByteArray.charMap[i] = String.fromCharCode(i);
        ByteArray.prototype.newPage = function () {
          this.pages[++this.page] = new Uint8Array(ByteArray.pageSize);
          this.cursor = 0;
        };
        ByteArray.prototype.getData = function () {
          var rv = '';
          for (var p = 0; p < this.pages.length; p++) {
            for (var i = 0; i < ByteArray.pageSize; i++) {
              rv += ByteArray.charMap[this.pages[p][i]];
            }
          }
          return rv;
        };
        ByteArray.prototype.writeByte = function (val) {
          if (this.cursor >= ByteArray.pageSize) this.newPage();
          this.pages[this.page][this.cursor++] = val;
        };
        ByteArray.prototype.writeUTFBytes = function (string) {
          for (var l = string.length, i = 0; i < l; i++)
            this.writeByte(string.charCodeAt(i));
        };
        ByteArray.prototype.writeBytes = function (array, offset, length) {
          for (var l = length || array.length, i = offset || 0; i < l; i++)
            this.writeByte(array[i]);
        };

        function GIFEncoder(width, height) {
          this.width = ~~width;
          this.height = ~~height;
          this.transparent = null;
          this.transIndex = 0;
          this.repeat = -1;
          this.delay = 0;
          this.image = null;
          this.pixels = null;
          this.indexedPixels = null;
          this.colorDepth = null;
          this.colorTab = null;
          this.neuQuant = null;
          this.usedEntry = new Array();
          this.palSize = 7;
          this.dispose = -1;
          this.firstFrame = true;
          this.sample = 10;
          this.dither = false;
          this.globalPalette = false;
          this.out = new ByteArray();
        }
        GIFEncoder.prototype.setDelay = function (milliseconds) {
          this.delay = Math.round(milliseconds / 10);
        };
        GIFEncoder.prototype.setFrameRate = function (fps) {
          this.delay = Math.round(100 / fps);
        };
        GIFEncoder.prototype.setDispose = function (disposalCode) {
          if (disposalCode >= 0) this.dispose = disposalCode;
        };
        GIFEncoder.prototype.setRepeat = function (repeat) {
          this.repeat = repeat;
        };
        GIFEncoder.prototype.setTransparent = function (color) {
          this.transparent = color;
        };
        GIFEncoder.prototype.addFrame = function (imageData) {
          this.image = imageData;
          this.colorTab =
            this.globalPalette && this.globalPalette.slice
              ? this.globalPalette
              : null;
          this.getImagePixels();
          this.analyzePixels();
          if (this.globalPalette === true) this.globalPalette = this.colorTab;
          if (this.firstFrame) {
            this.writeLSD();
            this.writePalette();
            if (this.repeat >= 0) {
              this.writeNetscapeExt();
            }
          }
          this.writeGraphicCtrlExt();
          this.writeImageDesc();
          if (!this.firstFrame && !this.globalPalette) this.writePalette();
          this.writePixels();
          this.firstFrame = false;
        };
        GIFEncoder.prototype.finish = function () {
          this.out.writeByte(59);
        };
        GIFEncoder.prototype.setQuality = function (quality) {
          if (quality < 1) quality = 1;
          this.sample = quality;
        };
        GIFEncoder.prototype.setDither = function (dither) {
          if (dither === true) dither = 'FloydSteinberg';
          this.dither = dither;
        };
        GIFEncoder.prototype.setGlobalPalette = function (palette) {
          this.globalPalette = palette;
        };
        GIFEncoder.prototype.getGlobalPalette = function () {
          return (
            (this.globalPalette &&
              this.globalPalette.slice &&
              this.globalPalette.slice(0)) ||
            this.globalPalette
          );
        };
        GIFEncoder.prototype.writeHeader = function () {
          this.out.writeUTFBytes('GIF89a');
        };
        GIFEncoder.prototype.analyzePixels = function () {
          if (!this.colorTab) {
            this.neuQuant = new NeuQuant(this.pixels, this.sample);
            this.neuQuant.buildColormap();
            this.colorTab = this.neuQuant.getColormap();
          }
          if (this.dither) {
            this.ditherPixels(
              this.dither.replace('-serpentine', ''),
              this.dither.match(/-serpentine/) !== null
            );
          } else {
            this.indexPixels();
          }
          this.pixels = null;
          this.colorDepth = 8;
          this.palSize = 7;
          if (this.transparent !== null) {
            this.transIndex = this.findClosest(this.transparent, true);
          }
        };
        GIFEncoder.prototype.indexPixels = function (imgq) {
          var nPix = this.pixels.length / 3;
          this.indexedPixels = new Uint8Array(nPix);
          var k = 0;
          for (var j = 0; j < nPix; j++) {
            var index = this.findClosestRGB(
              this.pixels[k++] & 255,
              this.pixels[k++] & 255,
              this.pixels[k++] & 255
            );
            this.usedEntry[index] = true;
            this.indexedPixels[j] = index;
          }
        };
        GIFEncoder.prototype.ditherPixels = function (kernel, serpentine) {
          var kernels = {
            FalseFloydSteinberg: [
              [3 / 8, 1, 0],
              [3 / 8, 0, 1],
              [2 / 8, 1, 1],
            ],
            FloydSteinberg: [
              [7 / 16, 1, 0],
              [3 / 16, -1, 1],
              [5 / 16, 0, 1],
              [1 / 16, 1, 1],
            ],
            Stucki: [
              [8 / 42, 1, 0],
              [4 / 42, 2, 0],
              [2 / 42, -2, 1],
              [4 / 42, -1, 1],
              [8 / 42, 0, 1],
              [4 / 42, 1, 1],
              [2 / 42, 2, 1],
              [1 / 42, -2, 2],
              [2 / 42, -1, 2],
              [4 / 42, 0, 2],
              [2 / 42, 1, 2],
              [1 / 42, 2, 2],
            ],
            Atkinson: [
              [1 / 8, 1, 0],
              [1 / 8, 2, 0],
              [1 / 8, -1, 1],
              [1 / 8, 0, 1],
              [1 / 8, 1, 1],
              [1 / 8, 0, 2],
            ],
          };
          if (!kernel || !kernels[kernel]) {
            throw 'Unknown dithering kernel: ' + kernel;
          }
          var ds = kernels[kernel];
          var index = 0,
            height = this.height,
            width = this.width,
            data = this.pixels;
          var direction = serpentine ? -1 : 1;
          this.indexedPixels = new Uint8Array(this.pixels.length / 3);
          for (var y = 0; y < height; y++) {
            if (serpentine) direction = direction * -1;
            for (
              var x = direction == 1 ? 0 : width - 1,
                xend = direction == 1 ? width : 0;
              x !== xend;
              x += direction
            ) {
              index = y * width + x;
              var idx = index * 3;
              var r1 = data[idx];
              var g1 = data[idx + 1];
              var b1 = data[idx + 2];
              idx = this.findClosestRGB(r1, g1, b1);
              this.usedEntry[idx] = true;
              this.indexedPixels[index] = idx;
              idx *= 3;
              var r2 = this.colorTab[idx];
              var g2 = this.colorTab[idx + 1];
              var b2 = this.colorTab[idx + 2];
              var er = r1 - r2;
              var eg = g1 - g2;
              var eb = b1 - b2;
              for (
                var i = direction == 1 ? 0 : ds.length - 1,
                  end = direction == 1 ? ds.length : 0;
                i !== end;
                i += direction
              ) {
                var x1 = ds[i][1];
                var y1 = ds[i][2];
                if (
                  x1 + x >= 0 &&
                  x1 + x < width &&
                  y1 + y >= 0 &&
                  y1 + y < height
                ) {
                  var d = ds[i][0];
                  idx = index + x1 + y1 * width;
                  idx *= 3;
                  data[idx] = Math.max(0, Math.min(255, data[idx] + er * d));
                  data[idx + 1] = Math.max(
                    0,
                    Math.min(255, data[idx + 1] + eg * d)
                  );
                  data[idx + 2] = Math.max(
                    0,
                    Math.min(255, data[idx + 2] + eb * d)
                  );
                }
              }
            }
          }
        };
        GIFEncoder.prototype.findClosest = function (c, used) {
          return this.findClosestRGB(
            (c & 16711680) >> 16,
            (c & 65280) >> 8,
            c & 255,
            used
          );
        };
        GIFEncoder.prototype.findClosestRGB = function (r, g, b, used) {
          if (this.colorTab === null) return -1;
          if (this.neuQuant && !used) {
            return this.neuQuant.lookupRGB(r, g, b);
          }
          var c = b | (g << 8) | (r << 16);
          var minpos = 0;
          var dmin = 256 * 256 * 256;
          var len = this.colorTab.length;
          for (var i = 0, index = 0; i < len; index++) {
            var dr = r - (this.colorTab[i++] & 255);
            var dg = g - (this.colorTab[i++] & 255);
            var db = b - (this.colorTab[i++] & 255);
            var d = dr * dr + dg * dg + db * db;
            if ((!used || this.usedEntry[index]) && d < dmin) {
              dmin = d;
              minpos = index;
            }
          }
          return minpos;
        };
        GIFEncoder.prototype.getImagePixels = function () {
          var w = this.width;
          var h = this.height;
          this.pixels = new Uint8Array(w * h * 3);
          var data = this.image;
          var srcPos = 0;
          var count = 0;
          for (var i = 0; i < h; i++) {
            for (var j = 0; j < w; j++) {
              this.pixels[count++] = data[srcPos++];
              this.pixels[count++] = data[srcPos++];
              this.pixels[count++] = data[srcPos++];
              srcPos++;
            }
          }
        };
        GIFEncoder.prototype.writeGraphicCtrlExt = function () {
          this.out.writeByte(33);
          this.out.writeByte(249);
          this.out.writeByte(4);
          var transp, disp;
          if (this.transparent === null) {
            transp = 0;
            disp = 0;
          } else {
            transp = 1;
            disp = 2;
          }
          if (this.dispose >= 0) {
            disp = dispose & 7;
          }
          disp <<= 2;
          this.out.writeByte(0 | disp | 0 | transp);
          this.writeShort(this.delay);
          this.out.writeByte(this.transIndex);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeImageDesc = function () {
          this.out.writeByte(44);
          this.writeShort(0);
          this.writeShort(0);
          this.writeShort(this.width);
          this.writeShort(this.height);
          if (this.firstFrame || this.globalPalette) {
            this.out.writeByte(0);
          } else {
            this.out.writeByte(128 | 0 | 0 | 0 | this.palSize);
          }
        };
        GIFEncoder.prototype.writeLSD = function () {
          this.writeShort(this.width);
          this.writeShort(this.height);
          this.out.writeByte(128 | 112 | 0 | this.palSize);
          this.out.writeByte(0);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeNetscapeExt = function () {
          this.out.writeByte(33);
          this.out.writeByte(255);
          this.out.writeByte(11);
          this.out.writeUTFBytes('NETSCAPE2.0');
          this.out.writeByte(3);
          this.out.writeByte(1);
          this.writeShort(this.repeat);
          this.out.writeByte(0);
        };
        GIFEncoder.prototype.writePalette = function () {
          this.out.writeBytes(this.colorTab);
          var n = 3 * 256 - this.colorTab.length;
          for (var i = 0; i < n; i++) this.out.writeByte(0);
        };
        GIFEncoder.prototype.writeShort = function (pValue) {
          this.out.writeByte(pValue & 255);
          this.out.writeByte((pValue >> 8) & 255);
        };
        GIFEncoder.prototype.writePixels = function () {
          var enc = new LZWEncoder(
            this.width,
            this.height,
            this.indexedPixels,
            this.colorDepth
          );
          enc.encode(this.out);
        };
        GIFEncoder.prototype.stream = function () {
          return this.out;
        };
        module.exports = GIFEncoder;
      },
      {
        './LZWEncoder.js': 2,
        './TypedNeuQuant.js': 3,
      },
    ],
    2: [
      function (require, module, exports) {
        var EOF = -1;
        var BITS = 12;
        var HSIZE = 5003;
        var masks = [
          0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383,
          32767, 65535,
        ];

        function LZWEncoder(width, height, pixels, colorDepth) {
          var initCodeSize = Math.max(2, colorDepth);
          var accum = new Uint8Array(256);
          var htab = new Int32Array(HSIZE);
          var codetab = new Int32Array(HSIZE);
          var cur_accum,
            cur_bits = 0;
          var a_count;
          var free_ent = 0;
          var maxcode;
          var clear_flg = false;
          var g_init_bits, ClearCode, EOFCode;

          function char_out(c, outs) {
            accum[a_count++] = c;
            if (a_count >= 254) flush_char(outs);
          }

          function cl_block(outs) {
            cl_hash(HSIZE);
            free_ent = ClearCode + 2;
            clear_flg = true;
            output(ClearCode, outs);
          }

          function cl_hash(hsize) {
            for (var i = 0; i < hsize; ++i) htab[i] = -1;
          }

          function compress(init_bits, outs) {
            var fcode, c, i, ent, disp, hsize_reg, hshift;
            g_init_bits = init_bits;
            clear_flg = false;
            n_bits = g_init_bits;
            maxcode = MAXCODE(n_bits);
            ClearCode = 1 << (init_bits - 1);
            EOFCode = ClearCode + 1;
            free_ent = ClearCode + 2;
            a_count = 0;
            ent = nextPixel();
            hshift = 0;
            for (fcode = HSIZE; fcode < 65536; fcode *= 2) ++hshift;
            hshift = 8 - hshift;
            hsize_reg = HSIZE;
            cl_hash(hsize_reg);
            output(ClearCode, outs);
            outer_loop: while ((c = nextPixel()) != EOF) {
              fcode = (c << BITS) + ent;
              i = (c << hshift) ^ ent;
              if (htab[i] === fcode) {
                ent = codetab[i];
                continue;
              } else if (htab[i] >= 0) {
                disp = hsize_reg - i;
                if (i === 0) disp = 1;
                do {
                  if ((i -= disp) < 0) i += hsize_reg;
                  if (htab[i] === fcode) {
                    ent = codetab[i];
                    continue outer_loop;
                  }
                } while (htab[i] >= 0);
              }
              output(ent, outs);
              ent = c;
              if (free_ent < 1 << BITS) {
                codetab[i] = free_ent++;
                htab[i] = fcode;
              } else {
                cl_block(outs);
              }
            }
            output(ent, outs);
            output(EOFCode, outs);
          }

          function encode(outs) {
            outs.writeByte(initCodeSize);
            remaining = width * height;
            curPixel = 0;
            compress(initCodeSize + 1, outs);
            outs.writeByte(0);
          }

          function flush_char(outs) {
            if (a_count > 0) {
              outs.writeByte(a_count);
              outs.writeBytes(accum, 0, a_count);
              a_count = 0;
            }
          }

          function MAXCODE(n_bits) {
            return (1 << n_bits) - 1;
          }

          function nextPixel() {
            if (remaining === 0) return EOF;
            --remaining;
            var pix = pixels[curPixel++];
            return pix & 255;
          }

          function output(code, outs) {
            cur_accum &= masks[cur_bits];
            if (cur_bits > 0) cur_accum |= code << cur_bits;
            else cur_accum = code;
            cur_bits += n_bits;
            while (cur_bits >= 8) {
              char_out(cur_accum & 255, outs);
              cur_accum >>= 8;
              cur_bits -= 8;
            }
            if (free_ent > maxcode || clear_flg) {
              if (clear_flg) {
                maxcode = MAXCODE((n_bits = g_init_bits));
                clear_flg = false;
              } else {
                ++n_bits;
                if (n_bits == BITS) maxcode = 1 << BITS;
                else maxcode = MAXCODE(n_bits);
              }
            }
            if (code == EOFCode) {
              while (cur_bits > 0) {
                char_out(cur_accum & 255, outs);
                cur_accum >>= 8;
                cur_bits -= 8;
              }
              flush_char(outs);
            }
          }
          this.encode = encode;
        }
        module.exports = LZWEncoder;
      },
      {},
    ],
    3: [
      function (require, module, exports) {
        var ncycles = 100;
        var netsize = 256;
        var maxnetpos = netsize - 1;
        var netbiasshift = 4;
        var intbiasshift = 16;
        var intbias = 1 << intbiasshift;
        var gammashift = 10;
        var gamma = 1 << gammashift;
        var betashift = 10;
        var beta = intbias >> betashift;
        var betagamma = intbias << (gammashift - betashift);
        var initrad = netsize >> 3;
        var radiusbiasshift = 6;
        var radiusbias = 1 << radiusbiasshift;
        var initradius = initrad * radiusbias;
        var radiusdec = 30;
        var alphabiasshift = 10;
        var initalpha = 1 << alphabiasshift;
        var alphadec;
        var radbiasshift = 8;
        var radbias = 1 << radbiasshift;
        var alpharadbshift = alphabiasshift + radbiasshift;
        var alpharadbias = 1 << alpharadbshift;
        var prime1 = 499;
        var prime2 = 491;
        var prime3 = 487;
        var prime4 = 503;
        var minpicturebytes = 3 * prime4;

        function NeuQuant(pixels, samplefac) {
          var network;
          var netindex;
          var bias;
          var freq;
          var radpower;

          function init() {
            network = [];
            netindex = new Int32Array(256);
            bias = new Int32Array(netsize);
            freq = new Int32Array(netsize);
            radpower = new Int32Array(netsize >> 3);
            var i, v;
            for (i = 0; i < netsize; i++) {
              v = (i << (netbiasshift + 8)) / netsize;
              network[i] = new Float64Array([v, v, v, 0]);
              freq[i] = intbias / netsize;
              bias[i] = 0;
            }
          }

          function unbiasnet() {
            for (var i = 0; i < netsize; i++) {
              network[i][0] >>= netbiasshift;
              network[i][1] >>= netbiasshift;
              network[i][2] >>= netbiasshift;
              network[i][3] = i;
            }
          }

          function altersingle(alpha, i, b, g, r) {
            network[i][0] -= (alpha * (network[i][0] - b)) / initalpha;
            network[i][1] -= (alpha * (network[i][1] - g)) / initalpha;
            network[i][2] -= (alpha * (network[i][2] - r)) / initalpha;
          }

          function alterneigh(radius, i, b, g, r) {
            var lo = Math.abs(i - radius);
            var hi = Math.min(i + radius, netsize);
            var j = i + 1;
            var k = i - 1;
            var m = 1;
            var p, a;
            while (j < hi || k > lo) {
              a = radpower[m++];
              if (j < hi) {
                p = network[j++];
                p[0] -= (a * (p[0] - b)) / alpharadbias;
                p[1] -= (a * (p[1] - g)) / alpharadbias;
                p[2] -= (a * (p[2] - r)) / alpharadbias;
              }
              if (k > lo) {
                p = network[k--];
                p[0] -= (a * (p[0] - b)) / alpharadbias;
                p[1] -= (a * (p[1] - g)) / alpharadbias;
                p[2] -= (a * (p[2] - r)) / alpharadbias;
              }
            }
          }

          function contest(b, g, r) {
            var bestd = ~(1 << 31);
            var bestbiasd = bestd;
            var bestpos = -1;
            var bestbiaspos = bestpos;
            var i, n, dist, biasdist, betafreq;
            for (i = 0; i < netsize; i++) {
              n = network[i];
              dist =
                Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);
              if (dist < bestd) {
                bestd = dist;
                bestpos = i;
              }
              biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift));
              if (biasdist < bestbiasd) {
                bestbiasd = biasdist;
                bestbiaspos = i;
              }
              betafreq = freq[i] >> betashift;
              freq[i] -= betafreq;
              bias[i] += betafreq << gammashift;
            }
            freq[bestpos] += beta;
            bias[bestpos] -= betagamma;
            return bestbiaspos;
          }

          function inxbuild() {
            var i,
              j,
              p,
              q,
              smallpos,
              smallval,
              previouscol = 0,
              startpos = 0;
            for (i = 0; i < netsize; i++) {
              p = network[i];
              smallpos = i;
              smallval = p[1];
              for (j = i + 1; j < netsize; j++) {
                q = network[j];
                if (q[1] < smallval) {
                  smallpos = j;
                  smallval = q[1];
                }
              }
              q = network[smallpos];
              if (i != smallpos) {
                j = q[0];
                q[0] = p[0];
                p[0] = j;
                j = q[1];
                q[1] = p[1];
                p[1] = j;
                j = q[2];
                q[2] = p[2];
                p[2] = j;
                j = q[3];
                q[3] = p[3];
                p[3] = j;
              }
              if (smallval != previouscol) {
                netindex[previouscol] = (startpos + i) >> 1;
                for (j = previouscol + 1; j < smallval; j++) netindex[j] = i;
                previouscol = smallval;
                startpos = i;
              }
            }
            netindex[previouscol] = (startpos + maxnetpos) >> 1;
            for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos;
          }

          function inxsearch(b, g, r) {
            var a, p, dist;
            var bestd = 1e3;
            var best = -1;
            var i = netindex[g];
            var j = i - 1;
            while (i < netsize || j >= 0) {
              if (i < netsize) {
                p = network[i];
                dist = p[1] - g;
                if (dist >= bestd) i = netsize;
                else {
                  i++;
                  if (dist < 0) dist = -dist;
                  a = p[0] - b;
                  if (a < 0) a = -a;
                  dist += a;
                  if (dist < bestd) {
                    a = p[2] - r;
                    if (a < 0) a = -a;
                    dist += a;
                    if (dist < bestd) {
                      bestd = dist;
                      best = p[3];
                    }
                  }
                }
              }
              if (j >= 0) {
                p = network[j];
                dist = g - p[1];
                if (dist >= bestd) j = -1;
                else {
                  j--;
                  if (dist < 0) dist = -dist;
                  a = p[0] - b;
                  if (a < 0) a = -a;
                  dist += a;
                  if (dist < bestd) {
                    a = p[2] - r;
                    if (a < 0) a = -a;
                    dist += a;
                    if (dist < bestd) {
                      bestd = dist;
                      best = p[3];
                    }
                  }
                }
              }
            }
            return best;
          }

          function learn() {
            var i;
            var lengthcount = pixels.length;
            var alphadec = 30 + (samplefac - 1) / 3;
            var samplepixels = lengthcount / (3 * samplefac);
            var delta = ~~(samplepixels / ncycles);
            var alpha = initalpha;
            var radius = initradius;
            var rad = radius >> radiusbiasshift;
            if (rad <= 1) rad = 0;
            for (i = 0; i < rad; i++)
              radpower[i] =
                alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
            var step;
            if (lengthcount < minpicturebytes) {
              samplefac = 1;
              step = 3;
            } else if (lengthcount % prime1 !== 0) {
              step = 3 * prime1;
            } else if (lengthcount % prime2 !== 0) {
              step = 3 * prime2;
            } else if (lengthcount % prime3 !== 0) {
              step = 3 * prime3;
            } else {
              step = 3 * prime4;
            }
            var b, g, r, j;
            var pix = 0;
            i = 0;
            while (i < samplepixels) {
              b = (pixels[pix] & 255) << netbiasshift;
              g = (pixels[pix + 1] & 255) << netbiasshift;
              r = (pixels[pix + 2] & 255) << netbiasshift;
              j = contest(b, g, r);
              altersingle(alpha, j, b, g, r);
              if (rad !== 0) alterneigh(rad, j, b, g, r);
              pix += step;
              if (pix >= lengthcount) pix -= lengthcount;
              i++;
              if (delta === 0) delta = 1;
              if (i % delta === 0) {
                alpha -= alpha / alphadec;
                radius -= radius / radiusdec;
                rad = radius >> radiusbiasshift;
                if (rad <= 1) rad = 0;
                for (j = 0; j < rad; j++)
                  radpower[j] =
                    alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
              }
            }
          }

          function buildColormap() {
            init();
            learn();
            unbiasnet();
            inxbuild();
          }
          this.buildColormap = buildColormap;

          function getColormap() {
            var map = [];
            var index = [];
            for (var i = 0; i < netsize; i++) index[network[i][3]] = i;
            var k = 0;
            for (var l = 0; l < netsize; l++) {
              var j = index[l];
              map[k++] = network[j][0];
              map[k++] = network[j][1];
              map[k++] = network[j][2];
            }
            return map;
          }
          this.getColormap = getColormap;
          this.lookupRGB = inxsearch;
        }
        module.exports = NeuQuant;
      },
      {},
    ],
    4: [
      function (require, module, exports) {
        var GIFEncoder, renderFrame;
        GIFEncoder = require('./GIFEncoder.js');
        renderFrame = function (frame) {
          var encoder, page, stream, transfer;
          encoder = new GIFEncoder(frame.width, frame.height);
          if (frame.index === 0) {
            encoder.writeHeader();
          } else {
            encoder.firstFrame = false;
          }
          encoder.setTransparent(frame.transparent);
          encoder.setRepeat(frame.repeat);
          encoder.setDelay(frame.delay);
          encoder.setQuality(frame.quality);
          encoder.setDither(frame.dither);
          encoder.setGlobalPalette(frame.globalPalette);
          encoder.addFrame(frame.data);
          if (frame.last) {
            encoder.finish();
          }
          if (frame.globalPalette === true) {
            frame.globalPalette = encoder.getGlobalPalette();
          }
          stream = encoder.stream();
          frame.data = stream.pages;
          frame.cursor = stream.cursor;
          frame.pageSize = stream.constructor.pageSize;
          if (frame.canTransfer) {
            transfer = (function () {
              var i, len, ref, results;
              ref = frame.data;
              results = [];
              for (i = 0, len = ref.length; i < len; i++) {
                page = ref[i];
                results.push(page.buffer);
              }
              return results;
            })();
            return self.postMessage(frame, transfer);
          } else {
            return self.postMessage(frame);
          }
        };
        self.onmessage = function (event) {
          return renderFrame(event.data);
        };
      },
      {
        './GIFEncoder.js': 1,
      },
    ],
  },
  {},
  [4]
);
//# sourceMappingURL=gif.worker.js.map
