2 * The buffer module from node.js, for the browser.
4 * @author Feross Aboukhadijeh <https://feross.org>
7 /* eslint-disable no-proto */
11 var base64 = require('base64-js')
12 var ieee754 = require('ieee754')
13 var customInspectSymbol =
14 (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation
15 ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation
18 exports.Buffer = Buffer
19 exports.SlowBuffer = SlowBuffer
20 exports.INSPECT_MAX_BYTES = 50
22 var K_MAX_LENGTH = 0x7fffffff
23 exports.kMaxLength = K_MAX_LENGTH
26 * If `Buffer.TYPED_ARRAY_SUPPORT`:
27 * === true Use Uint8Array implementation (fastest)
28 * === false Print warning and recommend using `buffer` v4.x which has an Object
29 * implementation (most compatible, even IE6)
31 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
32 * Opera 11.6+, iOS 4.2+.
34 * We report that the browser does not support typed arrays if the are not subclassable
35 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
36 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
37 * for __proto__ and has a buggy typed array implementation.
39 Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
41 if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
42 typeof console.error === 'function') {
44 'This browser lacks typed array (Uint8Array) support which is required by ' +
45 '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
49 function typedArraySupport () {
50 // Can typed array instances can be augmented?
52 var arr = new Uint8Array(1)
53 var proto = { foo: function () { return 42 } }
54 Object.setPrototypeOf(proto, Uint8Array.prototype)
55 Object.setPrototypeOf(arr, proto)
56 return arr.foo() === 42
62 Object.defineProperty(Buffer.prototype, 'parent', {
65 if (!Buffer.isBuffer(this)) return undefined
70 Object.defineProperty(Buffer.prototype, 'offset', {
73 if (!Buffer.isBuffer(this)) return undefined
74 return this.byteOffset
78 function createBuffer (length) {
79 if (length > K_MAX_LENGTH) {
80 throw new RangeError('The value "' + length + '" is invalid for option "size"')
82 // Return an augmented `Uint8Array` instance
83 var buf = new Uint8Array(length)
84 Object.setPrototypeOf(buf, Buffer.prototype)
89 * The Buffer constructor returns instances of `Uint8Array` that have their
90 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
91 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
92 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
93 * returns a single octet.
95 * The `Uint8Array` prototype remains unmodified.
98 function Buffer (arg, encodingOrOffset, length) {
100 if (typeof arg === 'number') {
101 if (typeof encodingOrOffset === 'string') {
103 'The "string" argument must be of type string. Received type number'
106 return allocUnsafe(arg)
108 return from(arg, encodingOrOffset, length)
111 Buffer.poolSize = 8192 // not used by this implementation
113 function from (value, encodingOrOffset, length) {
114 if (typeof value === 'string') {
115 return fromString(value, encodingOrOffset)
118 if (ArrayBuffer.isView(value)) {
119 return fromArrayView(value)
124 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
125 'or Array-like Object. Received type ' + (typeof value)
129 if (isInstance(value, ArrayBuffer) ||
130 (value && isInstance(value.buffer, ArrayBuffer))) {
131 return fromArrayBuffer(value, encodingOrOffset, length)
134 if (typeof SharedArrayBuffer !== 'undefined' &&
135 (isInstance(value, SharedArrayBuffer) ||
136 (value && isInstance(value.buffer, SharedArrayBuffer)))) {
137 return fromArrayBuffer(value, encodingOrOffset, length)
140 if (typeof value === 'number') {
142 'The "value" argument must not be of type number. Received type number'
146 var valueOf = value.valueOf && value.valueOf()
147 if (valueOf != null && valueOf !== value) {
148 return Buffer.from(valueOf, encodingOrOffset, length)
151 var b = fromObject(value)
154 if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
155 typeof value[Symbol.toPrimitive] === 'function') {
157 value[Symbol.toPrimitive]('string'), encodingOrOffset, length
162 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
163 'or Array-like Object. Received type ' + (typeof value)
168 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
169 * if value is a number.
170 * Buffer.from(str[, encoding])
172 * Buffer.from(buffer)
173 * Buffer.from(arrayBuffer[, byteOffset[, length]])
175 Buffer.from = function (value, encodingOrOffset, length) {
176 return from(value, encodingOrOffset, length)
179 // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
180 // https://github.com/feross/buffer/pull/148
181 Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)
182 Object.setPrototypeOf(Buffer, Uint8Array)
184 function assertSize (size) {
185 if (typeof size !== 'number') {
186 throw new TypeError('"size" argument must be of type number')
187 } else if (size < 0) {
188 throw new RangeError('The value "' + size + '" is invalid for option "size"')
192 function alloc (size, fill, encoding) {
195 return createBuffer(size)
197 if (fill !== undefined) {
198 // Only pay attention to encoding if it's a string. This
199 // prevents accidentally sending in a number that would
200 // be interpreted as a start offset.
201 return typeof encoding === 'string'
202 ? createBuffer(size).fill(fill, encoding)
203 : createBuffer(size).fill(fill)
205 return createBuffer(size)
209 * Creates a new filled Buffer instance.
210 * alloc(size[, fill[, encoding]])
212 Buffer.alloc = function (size, fill, encoding) {
213 return alloc(size, fill, encoding)
216 function allocUnsafe (size) {
218 return createBuffer(size < 0 ? 0 : checked(size) | 0)
222 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
224 Buffer.allocUnsafe = function (size) {
225 return allocUnsafe(size)
228 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
230 Buffer.allocUnsafeSlow = function (size) {
231 return allocUnsafe(size)
234 function fromString (string, encoding) {
235 if (typeof encoding !== 'string' || encoding === '') {
239 if (!Buffer.isEncoding(encoding)) {
240 throw new TypeError('Unknown encoding: ' + encoding)
243 var length = byteLength(string, encoding) | 0
244 var buf = createBuffer(length)
246 var actual = buf.write(string, encoding)
248 if (actual !== length) {
249 // Writing a hex string, for example, that contains invalid characters will
250 // cause everything after the first invalid character to be ignored. (e.g.
251 // 'abxxcd' will be treated as 'ab')
252 buf = buf.slice(0, actual)
258 function fromArrayLike (array) {
259 var length = array.length < 0 ? 0 : checked(array.length) | 0
260 var buf = createBuffer(length)
261 for (var i = 0; i < length; i += 1) {
262 buf[i] = array[i] & 255
267 function fromArrayView (arrayView) {
268 if (isInstance(arrayView, Uint8Array)) {
269 var copy = new Uint8Array(arrayView)
270 return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)
272 return fromArrayLike(arrayView)
275 function fromArrayBuffer (array, byteOffset, length) {
276 if (byteOffset < 0 || array.byteLength < byteOffset) {
277 throw new RangeError('"offset" is outside of buffer bounds')
280 if (array.byteLength < byteOffset + (length || 0)) {
281 throw new RangeError('"length" is outside of buffer bounds')
285 if (byteOffset === undefined && length === undefined) {
286 buf = new Uint8Array(array)
287 } else if (length === undefined) {
288 buf = new Uint8Array(array, byteOffset)
290 buf = new Uint8Array(array, byteOffset, length)
293 // Return an augmented `Uint8Array` instance
294 Object.setPrototypeOf(buf, Buffer.prototype)
299 function fromObject (obj) {
300 if (Buffer.isBuffer(obj)) {
301 var len = checked(obj.length) | 0
302 var buf = createBuffer(len)
304 if (buf.length === 0) {
308 obj.copy(buf, 0, 0, len)
312 if (obj.length !== undefined) {
313 if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
314 return createBuffer(0)
316 return fromArrayLike(obj)
319 if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
320 return fromArrayLike(obj.data)
324 function checked (length) {
325 // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
326 // length is NaN (which is otherwise coerced to zero.)
327 if (length >= K_MAX_LENGTH) {
328 throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
329 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
334 function SlowBuffer (length) {
335 if (+length != length) { // eslint-disable-line eqeqeq
338 return Buffer.alloc(+length)
341 Buffer.isBuffer = function isBuffer (b) {
342 return b != null && b._isBuffer === true &&
343 b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
346 Buffer.compare = function compare (a, b) {
347 if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
348 if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
349 if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
351 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
355 if (a === b) return 0
360 for (var i = 0, len = Math.min(x, y); i < len; ++i) {
373 Buffer.isEncoding = function isEncoding (encoding) {
374 switch (String(encoding).toLowerCase()) {
392 Buffer.concat = function concat (list, length) {
393 if (!Array.isArray(list)) {
394 throw new TypeError('"list" argument must be an Array of Buffers')
397 if (list.length === 0) {
398 return Buffer.alloc(0)
402 if (length === undefined) {
404 for (i = 0; i < list.length; ++i) {
405 length += list[i].length
409 var buffer = Buffer.allocUnsafe(length)
411 for (i = 0; i < list.length; ++i) {
413 if (isInstance(buf, Uint8Array)) {
414 if (pos + buf.length > buffer.length) {
415 Buffer.from(buf).copy(buffer, pos)
417 Uint8Array.prototype.set.call(
423 } else if (!Buffer.isBuffer(buf)) {
424 throw new TypeError('"list" argument must be an Array of Buffers')
426 buf.copy(buffer, pos)
433 function byteLength (string, encoding) {
434 if (Buffer.isBuffer(string)) {
437 if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
438 return string.byteLength
440 if (typeof string !== 'string') {
442 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
443 'Received type ' + typeof string
447 var len = string.length
448 var mustMatch = (arguments.length > 2 && arguments[2] === true)
449 if (!mustMatch && len === 0) return 0
451 // Use a for loop to avoid recursion
452 var loweredCase = false
461 return utf8ToBytes(string).length
470 return base64ToBytes(string).length
473 return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
475 encoding = ('' + encoding).toLowerCase()
480 Buffer.byteLength = byteLength
482 function slowToString (encoding, start, end) {
483 var loweredCase = false
485 // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
486 // property of a typed array.
488 // This behaves neither like String nor Uint8Array in that we set start/end
489 // to their upper/lower bounds if the value passed is out of range.
490 // undefined is handled specially as per ECMA-262 6th Edition,
491 // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
492 if (start === undefined || start < 0) {
495 // Return early if start > this.length. Done here to prevent potential uint32
496 // coercion fail below.
497 if (start > this.length) {
501 if (end === undefined || end > this.length) {
509 // Force coercion to uint32. This will also coerce falsey/NaN values to 0.
517 if (!encoding) encoding = 'utf8'
522 return hexSlice(this, start, end)
526 return utf8Slice(this, start, end)
529 return asciiSlice(this, start, end)
533 return latin1Slice(this, start, end)
536 return base64Slice(this, start, end)
542 return utf16leSlice(this, start, end)
545 if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
546 encoding = (encoding + '').toLowerCase()
552 // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
553 // to detect a Buffer instance. It's not possible to use `instanceof Buffer`
554 // reliably in a browserify context because there could be multiple different
555 // copies of the 'buffer' package in use. This method works even for Buffer
556 // instances that were created from another copy of the `buffer` package.
557 // See: https://github.com/feross/buffer/issues/154
558 Buffer.prototype._isBuffer = true
560 function swap (b, n, m) {
566 Buffer.prototype.swap16 = function swap16 () {
567 var len = this.length
569 throw new RangeError('Buffer size must be a multiple of 16-bits')
571 for (var i = 0; i < len; i += 2) {
577 Buffer.prototype.swap32 = function swap32 () {
578 var len = this.length
580 throw new RangeError('Buffer size must be a multiple of 32-bits')
582 for (var i = 0; i < len; i += 4) {
584 swap(this, i + 1, i + 2)
589 Buffer.prototype.swap64 = function swap64 () {
590 var len = this.length
592 throw new RangeError('Buffer size must be a multiple of 64-bits')
594 for (var i = 0; i < len; i += 8) {
596 swap(this, i + 1, i + 6)
597 swap(this, i + 2, i + 5)
598 swap(this, i + 3, i + 4)
603 Buffer.prototype.toString = function toString () {
604 var length = this.length
605 if (length === 0) return ''
606 if (arguments.length === 0) return utf8Slice(this, 0, length)
607 return slowToString.apply(this, arguments)
610 Buffer.prototype.toLocaleString = Buffer.prototype.toString
612 Buffer.prototype.equals = function equals (b) {
613 if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
614 if (this === b) return true
615 return Buffer.compare(this, b) === 0
618 Buffer.prototype.inspect = function inspect () {
620 var max = exports.INSPECT_MAX_BYTES
621 str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
622 if (this.length > max) str += ' ... '
623 return '<Buffer ' + str + '>'
625 if (customInspectSymbol) {
626 Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect
629 Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
630 if (isInstance(target, Uint8Array)) {
631 target = Buffer.from(target, target.offset, target.byteLength)
633 if (!Buffer.isBuffer(target)) {
635 'The "target" argument must be one of type Buffer or Uint8Array. ' +
636 'Received type ' + (typeof target)
640 if (start === undefined) {
643 if (end === undefined) {
644 end = target ? target.length : 0
646 if (thisStart === undefined) {
649 if (thisEnd === undefined) {
650 thisEnd = this.length
653 if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
654 throw new RangeError('out of range index')
657 if (thisStart >= thisEnd && start >= end) {
660 if (thisStart >= thisEnd) {
672 if (this === target) return 0
674 var x = thisEnd - thisStart
676 var len = Math.min(x, y)
678 var thisCopy = this.slice(thisStart, thisEnd)
679 var targetCopy = target.slice(start, end)
681 for (var i = 0; i < len; ++i) {
682 if (thisCopy[i] !== targetCopy[i]) {
694 // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
695 // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
698 // - buffer - a Buffer to search
699 // - val - a string, Buffer, or number
700 // - byteOffset - an index into `buffer`; will be clamped to an int32
701 // - encoding - an optional encoding, relevant is val is a string
702 // - dir - true for indexOf, false for lastIndexOf
703 function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
704 // Empty buffer means no match
705 if (buffer.length === 0) return -1
707 // Normalize byteOffset
708 if (typeof byteOffset === 'string') {
709 encoding = byteOffset
711 } else if (byteOffset > 0x7fffffff) {
712 byteOffset = 0x7fffffff
713 } else if (byteOffset < -0x80000000) {
714 byteOffset = -0x80000000
716 byteOffset = +byteOffset // Coerce to Number.
717 if (numberIsNaN(byteOffset)) {
718 // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
719 byteOffset = dir ? 0 : (buffer.length - 1)
722 // Normalize byteOffset: negative offsets start from the end of the buffer
723 if (byteOffset < 0) byteOffset = buffer.length + byteOffset
724 if (byteOffset >= buffer.length) {
726 else byteOffset = buffer.length - 1
727 } else if (byteOffset < 0) {
728 if (dir) byteOffset = 0
733 if (typeof val === 'string') {
734 val = Buffer.from(val, encoding)
737 // Finally, search either indexOf (if dir is true) or lastIndexOf
738 if (Buffer.isBuffer(val)) {
739 // Special case: looking for empty string/buffer always fails
740 if (val.length === 0) {
743 return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
744 } else if (typeof val === 'number') {
745 val = val & 0xFF // Search for a byte value [0-255]
746 if (typeof Uint8Array.prototype.indexOf === 'function') {
748 return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
750 return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
753 return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
756 throw new TypeError('val must be string, number or Buffer')
759 function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
761 var arrLength = arr.length
762 var valLength = val.length
764 if (encoding !== undefined) {
765 encoding = String(encoding).toLowerCase()
766 if (encoding === 'ucs2' || encoding === 'ucs-2' ||
767 encoding === 'utf16le' || encoding === 'utf-16le') {
768 if (arr.length < 2 || val.length < 2) {
778 function read (buf, i) {
779 if (indexSize === 1) {
782 return buf.readUInt16BE(i * indexSize)
789 for (i = byteOffset; i < arrLength; i++) {
790 if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
791 if (foundIndex === -1) foundIndex = i
792 if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
794 if (foundIndex !== -1) i -= i - foundIndex
799 if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
800 for (i = byteOffset; i >= 0; i--) {
802 for (var j = 0; j < valLength; j++) {
803 if (read(arr, i + j) !== read(val, j)) {
815 Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
816 return this.indexOf(val, byteOffset, encoding) !== -1
819 Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
820 return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
823 Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
824 return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
827 function hexWrite (buf, string, offset, length) {
828 offset = Number(offset) || 0
829 var remaining = buf.length - offset
833 length = Number(length)
834 if (length > remaining) {
839 var strLen = string.length
841 if (length > strLen / 2) {
844 for (var i = 0; i < length; ++i) {
845 var parsed = parseInt(string.substr(i * 2, 2), 16)
846 if (numberIsNaN(parsed)) return i
847 buf[offset + i] = parsed
852 function utf8Write (buf, string, offset, length) {
853 return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
856 function asciiWrite (buf, string, offset, length) {
857 return blitBuffer(asciiToBytes(string), buf, offset, length)
860 function base64Write (buf, string, offset, length) {
861 return blitBuffer(base64ToBytes(string), buf, offset, length)
864 function ucs2Write (buf, string, offset, length) {
865 return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
868 Buffer.prototype.write = function write (string, offset, length, encoding) {
869 // Buffer#write(string)
870 if (offset === undefined) {
874 // Buffer#write(string, encoding)
875 } else if (length === undefined && typeof offset === 'string') {
879 // Buffer#write(string, offset[, length][, encoding])
880 } else if (isFinite(offset)) {
881 offset = offset >>> 0
882 if (isFinite(length)) {
883 length = length >>> 0
884 if (encoding === undefined) encoding = 'utf8'
891 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
895 var remaining = this.length - offset
896 if (length === undefined || length > remaining) length = remaining
898 if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
899 throw new RangeError('Attempt to write outside buffer bounds')
902 if (!encoding) encoding = 'utf8'
904 var loweredCase = false
908 return hexWrite(this, string, offset, length)
912 return utf8Write(this, string, offset, length)
917 return asciiWrite(this, string, offset, length)
920 // Warning: maxLength not taken into account in base64Write
921 return base64Write(this, string, offset, length)
927 return ucs2Write(this, string, offset, length)
930 if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
931 encoding = ('' + encoding).toLowerCase()
937 Buffer.prototype.toJSON = function toJSON () {
940 data: Array.prototype.slice.call(this._arr || this, 0)
944 function base64Slice (buf, start, end) {
945 if (start === 0 && end === buf.length) {
946 return base64.fromByteArray(buf)
948 return base64.fromByteArray(buf.slice(start, end))
952 function utf8Slice (buf, start, end) {
953 end = Math.min(buf.length, end)
958 var firstByte = buf[i]
960 var bytesPerSequence = (firstByte > 0xEF)
968 if (i + bytesPerSequence <= end) {
969 var secondByte, thirdByte, fourthByte, tempCodePoint
971 switch (bytesPerSequence) {
973 if (firstByte < 0x80) {
974 codePoint = firstByte
978 secondByte = buf[i + 1]
979 if ((secondByte & 0xC0) === 0x80) {
980 tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
981 if (tempCodePoint > 0x7F) {
982 codePoint = tempCodePoint
987 secondByte = buf[i + 1]
988 thirdByte = buf[i + 2]
989 if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
990 tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
991 if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
992 codePoint = tempCodePoint
997 secondByte = buf[i + 1]
998 thirdByte = buf[i + 2]
999 fourthByte = buf[i + 3]
1000 if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
1001 tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
1002 if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
1003 codePoint = tempCodePoint
1009 if (codePoint === null) {
1010 // we did not generate a valid codePoint so insert a
1011 // replacement char (U+FFFD) and advance only 1 byte
1013 bytesPerSequence = 1
1014 } else if (codePoint > 0xFFFF) {
1015 // encode to utf16 (surrogate pair dance)
1016 codePoint -= 0x10000
1017 res.push(codePoint >>> 10 & 0x3FF | 0xD800)
1018 codePoint = 0xDC00 | codePoint & 0x3FF
1022 i += bytesPerSequence
1025 return decodeCodePointsArray(res)
1028 // Based on http://stackoverflow.com/a/22747272/680742, the browser with
1029 // the lowest limit is Chrome, with 0x10000 args.
1030 // We go 1 magnitude less, for safety
1031 var MAX_ARGUMENTS_LENGTH = 0x1000
1033 function decodeCodePointsArray (codePoints) {
1034 var len = codePoints.length
1035 if (len <= MAX_ARGUMENTS_LENGTH) {
1036 return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
1039 // Decode in chunks to avoid "call stack size exceeded".
1043 res += String.fromCharCode.apply(
1045 codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
1051 function asciiSlice (buf, start, end) {
1053 end = Math.min(buf.length, end)
1055 for (var i = start; i < end; ++i) {
1056 ret += String.fromCharCode(buf[i] & 0x7F)
1061 function latin1Slice (buf, start, end) {
1063 end = Math.min(buf.length, end)
1065 for (var i = start; i < end; ++i) {
1066 ret += String.fromCharCode(buf[i])
1071 function hexSlice (buf, start, end) {
1072 var len = buf.length
1074 if (!start || start < 0) start = 0
1075 if (!end || end < 0 || end > len) end = len
1078 for (var i = start; i < end; ++i) {
1079 out += hexSliceLookupTable[buf[i]]
1084 function utf16leSlice (buf, start, end) {
1085 var bytes = buf.slice(start, end)
1087 // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)
1088 for (var i = 0; i < bytes.length - 1; i += 2) {
1089 res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
1094 Buffer.prototype.slice = function slice (start, end) {
1095 var len = this.length
1097 end = end === undefined ? len : ~~end
1101 if (start < 0) start = 0
1102 } else if (start > len) {
1108 if (end < 0) end = 0
1109 } else if (end > len) {
1113 if (end < start) end = start
1115 var newBuf = this.subarray(start, end)
1116 // Return an augmented `Uint8Array` instance
1117 Object.setPrototypeOf(newBuf, Buffer.prototype)
1123 * Need to make sure that buffer isn't trying to write out of bounds.
1125 function checkOffset (offset, ext, length) {
1126 if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
1127 if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
1130 Buffer.prototype.readUintLE =
1131 Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
1132 offset = offset >>> 0
1133 byteLength = byteLength >>> 0
1134 if (!noAssert) checkOffset(offset, byteLength, this.length)
1136 var val = this[offset]
1139 while (++i < byteLength && (mul *= 0x100)) {
1140 val += this[offset + i] * mul
1146 Buffer.prototype.readUintBE =
1147 Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
1148 offset = offset >>> 0
1149 byteLength = byteLength >>> 0
1151 checkOffset(offset, byteLength, this.length)
1154 var val = this[offset + --byteLength]
1156 while (byteLength > 0 && (mul *= 0x100)) {
1157 val += this[offset + --byteLength] * mul
1163 Buffer.prototype.readUint8 =
1164 Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
1165 offset = offset >>> 0
1166 if (!noAssert) checkOffset(offset, 1, this.length)
1170 Buffer.prototype.readUint16LE =
1171 Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
1172 offset = offset >>> 0
1173 if (!noAssert) checkOffset(offset, 2, this.length)
1174 return this[offset] | (this[offset + 1] << 8)
1177 Buffer.prototype.readUint16BE =
1178 Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
1179 offset = offset >>> 0
1180 if (!noAssert) checkOffset(offset, 2, this.length)
1181 return (this[offset] << 8) | this[offset + 1]
1184 Buffer.prototype.readUint32LE =
1185 Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
1186 offset = offset >>> 0
1187 if (!noAssert) checkOffset(offset, 4, this.length)
1189 return ((this[offset]) |
1190 (this[offset + 1] << 8) |
1191 (this[offset + 2] << 16)) +
1192 (this[offset + 3] * 0x1000000)
1195 Buffer.prototype.readUint32BE =
1196 Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
1197 offset = offset >>> 0
1198 if (!noAssert) checkOffset(offset, 4, this.length)
1200 return (this[offset] * 0x1000000) +
1201 ((this[offset + 1] << 16) |
1202 (this[offset + 2] << 8) |
1206 Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
1207 offset = offset >>> 0
1208 byteLength = byteLength >>> 0
1209 if (!noAssert) checkOffset(offset, byteLength, this.length)
1211 var val = this[offset]
1214 while (++i < byteLength && (mul *= 0x100)) {
1215 val += this[offset + i] * mul
1219 if (val >= mul) val -= Math.pow(2, 8 * byteLength)
1224 Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
1225 offset = offset >>> 0
1226 byteLength = byteLength >>> 0
1227 if (!noAssert) checkOffset(offset, byteLength, this.length)
1231 var val = this[offset + --i]
1232 while (i > 0 && (mul *= 0x100)) {
1233 val += this[offset + --i] * mul
1237 if (val >= mul) val -= Math.pow(2, 8 * byteLength)
1242 Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
1243 offset = offset >>> 0
1244 if (!noAssert) checkOffset(offset, 1, this.length)
1245 if (!(this[offset] & 0x80)) return (this[offset])
1246 return ((0xff - this[offset] + 1) * -1)
1249 Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
1250 offset = offset >>> 0
1251 if (!noAssert) checkOffset(offset, 2, this.length)
1252 var val = this[offset] | (this[offset + 1] << 8)
1253 return (val & 0x8000) ? val | 0xFFFF0000 : val
1256 Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
1257 offset = offset >>> 0
1258 if (!noAssert) checkOffset(offset, 2, this.length)
1259 var val = this[offset + 1] | (this[offset] << 8)
1260 return (val & 0x8000) ? val | 0xFFFF0000 : val
1263 Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
1264 offset = offset >>> 0
1265 if (!noAssert) checkOffset(offset, 4, this.length)
1267 return (this[offset]) |
1268 (this[offset + 1] << 8) |
1269 (this[offset + 2] << 16) |
1270 (this[offset + 3] << 24)
1273 Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
1274 offset = offset >>> 0
1275 if (!noAssert) checkOffset(offset, 4, this.length)
1277 return (this[offset] << 24) |
1278 (this[offset + 1] << 16) |
1279 (this[offset + 2] << 8) |
1283 Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
1284 offset = offset >>> 0
1285 if (!noAssert) checkOffset(offset, 4, this.length)
1286 return ieee754.read(this, offset, true, 23, 4)
1289 Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
1290 offset = offset >>> 0
1291 if (!noAssert) checkOffset(offset, 4, this.length)
1292 return ieee754.read(this, offset, false, 23, 4)
1295 Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
1296 offset = offset >>> 0
1297 if (!noAssert) checkOffset(offset, 8, this.length)
1298 return ieee754.read(this, offset, true, 52, 8)
1301 Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
1302 offset = offset >>> 0
1303 if (!noAssert) checkOffset(offset, 8, this.length)
1304 return ieee754.read(this, offset, false, 52, 8)
1307 function checkInt (buf, value, offset, ext, max, min) {
1308 if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
1309 if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
1310 if (offset + ext > buf.length) throw new RangeError('Index out of range')
1313 Buffer.prototype.writeUintLE =
1314 Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
1316 offset = offset >>> 0
1317 byteLength = byteLength >>> 0
1319 var maxBytes = Math.pow(2, 8 * byteLength) - 1
1320 checkInt(this, value, offset, byteLength, maxBytes, 0)
1325 this[offset] = value & 0xFF
1326 while (++i < byteLength && (mul *= 0x100)) {
1327 this[offset + i] = (value / mul) & 0xFF
1330 return offset + byteLength
1333 Buffer.prototype.writeUintBE =
1334 Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
1336 offset = offset >>> 0
1337 byteLength = byteLength >>> 0
1339 var maxBytes = Math.pow(2, 8 * byteLength) - 1
1340 checkInt(this, value, offset, byteLength, maxBytes, 0)
1343 var i = byteLength - 1
1345 this[offset + i] = value & 0xFF
1346 while (--i >= 0 && (mul *= 0x100)) {
1347 this[offset + i] = (value / mul) & 0xFF
1350 return offset + byteLength
1353 Buffer.prototype.writeUint8 =
1354 Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
1356 offset = offset >>> 0
1357 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
1358 this[offset] = (value & 0xff)
1362 Buffer.prototype.writeUint16LE =
1363 Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
1365 offset = offset >>> 0
1366 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
1367 this[offset] = (value & 0xff)
1368 this[offset + 1] = (value >>> 8)
1372 Buffer.prototype.writeUint16BE =
1373 Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
1375 offset = offset >>> 0
1376 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
1377 this[offset] = (value >>> 8)
1378 this[offset + 1] = (value & 0xff)
1382 Buffer.prototype.writeUint32LE =
1383 Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
1385 offset = offset >>> 0
1386 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
1387 this[offset + 3] = (value >>> 24)
1388 this[offset + 2] = (value >>> 16)
1389 this[offset + 1] = (value >>> 8)
1390 this[offset] = (value & 0xff)
1394 Buffer.prototype.writeUint32BE =
1395 Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
1397 offset = offset >>> 0
1398 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
1399 this[offset] = (value >>> 24)
1400 this[offset + 1] = (value >>> 16)
1401 this[offset + 2] = (value >>> 8)
1402 this[offset + 3] = (value & 0xff)
1406 Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
1408 offset = offset >>> 0
1410 var limit = Math.pow(2, (8 * byteLength) - 1)
1412 checkInt(this, value, offset, byteLength, limit - 1, -limit)
1418 this[offset] = value & 0xFF
1419 while (++i < byteLength && (mul *= 0x100)) {
1420 if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
1423 this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
1426 return offset + byteLength
1429 Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
1431 offset = offset >>> 0
1433 var limit = Math.pow(2, (8 * byteLength) - 1)
1435 checkInt(this, value, offset, byteLength, limit - 1, -limit)
1438 var i = byteLength - 1
1441 this[offset + i] = value & 0xFF
1442 while (--i >= 0 && (mul *= 0x100)) {
1443 if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
1446 this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
1449 return offset + byteLength
1452 Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
1454 offset = offset >>> 0
1455 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
1456 if (value < 0) value = 0xff + value + 1
1457 this[offset] = (value & 0xff)
1461 Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
1463 offset = offset >>> 0
1464 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
1465 this[offset] = (value & 0xff)
1466 this[offset + 1] = (value >>> 8)
1470 Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
1472 offset = offset >>> 0
1473 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
1474 this[offset] = (value >>> 8)
1475 this[offset + 1] = (value & 0xff)
1479 Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
1481 offset = offset >>> 0
1482 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
1483 this[offset] = (value & 0xff)
1484 this[offset + 1] = (value >>> 8)
1485 this[offset + 2] = (value >>> 16)
1486 this[offset + 3] = (value >>> 24)
1490 Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
1492 offset = offset >>> 0
1493 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
1494 if (value < 0) value = 0xffffffff + value + 1
1495 this[offset] = (value >>> 24)
1496 this[offset + 1] = (value >>> 16)
1497 this[offset + 2] = (value >>> 8)
1498 this[offset + 3] = (value & 0xff)
1502 function checkIEEE754 (buf, value, offset, ext, max, min) {
1503 if (offset + ext > buf.length) throw new RangeError('Index out of range')
1504 if (offset < 0) throw new RangeError('Index out of range')
1507 function writeFloat (buf, value, offset, littleEndian, noAssert) {
1509 offset = offset >>> 0
1511 checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
1513 ieee754.write(buf, value, offset, littleEndian, 23, 4)
1517 Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
1518 return writeFloat(this, value, offset, true, noAssert)
1521 Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
1522 return writeFloat(this, value, offset, false, noAssert)
1525 function writeDouble (buf, value, offset, littleEndian, noAssert) {
1527 offset = offset >>> 0
1529 checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
1531 ieee754.write(buf, value, offset, littleEndian, 52, 8)
1535 Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
1536 return writeDouble(this, value, offset, true, noAssert)
1539 Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
1540 return writeDouble(this, value, offset, false, noAssert)
1543 // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
1544 Buffer.prototype.copy = function copy (target, targetStart, start, end) {
1545 if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
1546 if (!start) start = 0
1547 if (!end && end !== 0) end = this.length
1548 if (targetStart >= target.length) targetStart = target.length
1549 if (!targetStart) targetStart = 0
1550 if (end > 0 && end < start) end = start
1552 // Copy 0 bytes; we're done
1553 if (end === start) return 0
1554 if (target.length === 0 || this.length === 0) return 0
1556 // Fatal error conditions
1557 if (targetStart < 0) {
1558 throw new RangeError('targetStart out of bounds')
1560 if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
1561 if (end < 0) throw new RangeError('sourceEnd out of bounds')
1564 if (end > this.length) end = this.length
1565 if (target.length - targetStart < end - start) {
1566 end = target.length - targetStart + start
1569 var len = end - start
1571 if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
1572 // Use built-in when available, missing from IE11
1573 this.copyWithin(targetStart, start, end)
1575 Uint8Array.prototype.set.call(
1577 this.subarray(start, end),
1586 // buffer.fill(number[, offset[, end]])
1587 // buffer.fill(buffer[, offset[, end]])
1588 // buffer.fill(string[, offset[, end]][, encoding])
1589 Buffer.prototype.fill = function fill (val, start, end, encoding) {
1590 // Handle string cases:
1591 if (typeof val === 'string') {
1592 if (typeof start === 'string') {
1596 } else if (typeof end === 'string') {
1600 if (encoding !== undefined && typeof encoding !== 'string') {
1601 throw new TypeError('encoding must be a string')
1603 if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
1604 throw new TypeError('Unknown encoding: ' + encoding)
1606 if (val.length === 1) {
1607 var code = val.charCodeAt(0)
1608 if ((encoding === 'utf8' && code < 128) ||
1609 encoding === 'latin1') {
1610 // Fast path: If `val` fits into a single byte, use that numeric value.
1614 } else if (typeof val === 'number') {
1616 } else if (typeof val === 'boolean') {
1620 // Invalid ranges are not set to a default, so can range check early.
1621 if (start < 0 || this.length < start || this.length < end) {
1622 throw new RangeError('Out of range index')
1630 end = end === undefined ? this.length : end >>> 0
1635 if (typeof val === 'number') {
1636 for (i = start; i < end; ++i) {
1640 var bytes = Buffer.isBuffer(val)
1642 : Buffer.from(val, encoding)
1643 var len = bytes.length
1645 throw new TypeError('The value "' + val +
1646 '" is invalid for argument "value"')
1648 for (i = 0; i < end - start; ++i) {
1649 this[i + start] = bytes[i % len]
1659 var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
1661 function base64clean (str) {
1662 // Node takes equal signs as end of the Base64 encoding
1663 str = str.split('=')[0]
1664 // Node strips out invalid characters like \n and \t from the string, base64-js does not
1665 str = str.trim().replace(INVALID_BASE64_RE, '')
1666 // Node converts strings with length < 2 to ''
1667 if (str.length < 2) return ''
1668 // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
1669 while (str.length % 4 !== 0) {
1675 function utf8ToBytes (string, units) {
1676 units = units || Infinity
1678 var length = string.length
1679 var leadSurrogate = null
1682 for (var i = 0; i < length; ++i) {
1683 codePoint = string.charCodeAt(i)
1685 // is surrogate component
1686 if (codePoint > 0xD7FF && codePoint < 0xE000) {
1687 // last char was a lead
1688 if (!leadSurrogate) {
1690 if (codePoint > 0xDBFF) {
1692 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1694 } else if (i + 1 === length) {
1696 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1701 leadSurrogate = codePoint
1707 if (codePoint < 0xDC00) {
1708 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1709 leadSurrogate = codePoint
1713 // valid surrogate pair
1714 codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
1715 } else if (leadSurrogate) {
1716 // valid bmp char, but last char was a lead
1717 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1720 leadSurrogate = null
1723 if (codePoint < 0x80) {
1724 if ((units -= 1) < 0) break
1725 bytes.push(codePoint)
1726 } else if (codePoint < 0x800) {
1727 if ((units -= 2) < 0) break
1729 codePoint >> 0x6 | 0xC0,
1730 codePoint & 0x3F | 0x80
1732 } else if (codePoint < 0x10000) {
1733 if ((units -= 3) < 0) break
1735 codePoint >> 0xC | 0xE0,
1736 codePoint >> 0x6 & 0x3F | 0x80,
1737 codePoint & 0x3F | 0x80
1739 } else if (codePoint < 0x110000) {
1740 if ((units -= 4) < 0) break
1742 codePoint >> 0x12 | 0xF0,
1743 codePoint >> 0xC & 0x3F | 0x80,
1744 codePoint >> 0x6 & 0x3F | 0x80,
1745 codePoint & 0x3F | 0x80
1748 throw new Error('Invalid code point')
1755 function asciiToBytes (str) {
1757 for (var i = 0; i < str.length; ++i) {
1758 // Node's code seems to be doing this and not & 0x7F..
1759 byteArray.push(str.charCodeAt(i) & 0xFF)
1764 function utf16leToBytes (str, units) {
1767 for (var i = 0; i < str.length; ++i) {
1768 if ((units -= 2) < 0) break
1770 c = str.charCodeAt(i)
1780 function base64ToBytes (str) {
1781 return base64.toByteArray(base64clean(str))
1784 function blitBuffer (src, dst, offset, length) {
1785 for (var i = 0; i < length; ++i) {
1786 if ((i + offset >= dst.length) || (i >= src.length)) break
1787 dst[i + offset] = src[i]
1792 // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
1793 // the `instanceof` check but they should be treated as of that type.
1794 // See: https://github.com/feross/buffer/issues/166
1795 function isInstance (obj, type) {
1796 return obj instanceof type ||
1797 (obj != null && obj.constructor != null && obj.constructor.name != null &&
1798 obj.constructor.name === type.name)
1800 function numberIsNaN (obj) {
1802 return obj !== obj // eslint-disable-line no-self-compare
1805 // Create lookup table for `toString('hex')`
1806 // See: https://github.com/feross/buffer/issues/219
1807 var hexSliceLookupTable = (function () {
1808 var alphabet = '0123456789abcdef'
1809 var table = new Array(256)
1810 for (var i = 0; i < 16; ++i) {
1812 for (var j = 0; j < 16; ++j) {
1813 table[i16 + j] = alphabet[i] + alphabet[j]