'use strict';

var buffer = require('buffer'); var Buffer = buffer.Buffer; var SlowBuffer = buffer.SlowBuffer; var MAX_LEN = buffer.kMaxLength || 2147483647; exports.alloc = function alloc(size, fill, encoding) {

if (typeof Buffer.alloc === 'function') {
  return Buffer.alloc(size, fill, encoding);
}
if (typeof encoding === 'number') {
  throw new TypeError('encoding must not be number');
}
if (typeof size !== 'number') {
  throw new TypeError('size must be a number');
}
if (size > MAX_LEN) {
  throw new RangeError('size is too large');
}
var enc = encoding;
var _fill = fill;
if (_fill === undefined) {
  enc = undefined;
  _fill = 0;
}
var buf = new Buffer(size);
if (typeof _fill === 'string') {
  var fillBuf = new Buffer(_fill, enc);
  var flen = fillBuf.length;
  var i = -1;
  while (++i < size) {
    buf[i] = fillBuf[i % flen];
  }
} else {
  buf.fill(_fill);
}
return buf;

} exports.allocUnsafe = function allocUnsafe(size) {

if (typeof Buffer.allocUnsafe === 'function') {
  return Buffer.allocUnsafe(size);
}
if (typeof size !== 'number') {
  throw new TypeError('size must be a number');
}
if (size > MAX_LEN) {
  throw new RangeError('size is too large');
}
return new Buffer(size);

} exports.from = function from(value, encodingOrOffset, length) {

if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {
  return Buffer.from(value, encodingOrOffset, length);
}
if (typeof value === 'number') {
  throw new TypeError('"value" argument must not be a number');
}
if (typeof value === 'string') {
  return new Buffer(value, encodingOrOffset);
}
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
  var offset = encodingOrOffset;
  if (arguments.length === 1) {
    return new Buffer(value);
  }
  if (typeof offset === 'undefined') {
    offset = 0;
  }
  var len = length;
  if (typeof len === 'undefined') {
    len = value.byteLength - offset;
  }
  if (offset >= value.byteLength) {
    throw new RangeError('\'offset\' is out of bounds');
  }
  if (len > value.byteLength - offset) {
    throw new RangeError('\'length\' is out of bounds');
  }
  return new Buffer(value.slice(offset, offset + len));
}
if (Buffer.isBuffer(value)) {
  var out = new Buffer(value.length);
  value.copy(out, 0, 0, value.length);
  return out;
}
if (value) {
  if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {
    return new Buffer(value);
  }
  if (value.type === 'Buffer' && Array.isArray(value.data)) {
    return new Buffer(value.data);
  }
}

throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');

} exports.allocUnsafeSlow = function allocUnsafeSlow(size) {

if (typeof Buffer.allocUnsafeSlow === 'function') {
  return Buffer.allocUnsafeSlow(size);
}
if (typeof size !== 'number') {
  throw new TypeError('size must be a number');
}
if (size >= MAX_LEN) {
  throw new RangeError('size is too large');
}
return new SlowBuffer(size);

}