pax_global_header00006660000000000000000000000064143155443750014525gustar00rootroot0000000000000052 comment=17e8dac29df8ce00febbd08ee5d8ee922024a003 pgzip-1.2.6/000077500000000000000000000000001431554437500126645ustar00rootroot00000000000000pgzip-1.2.6/.gitignore000066400000000000000000000004121431554437500146510ustar00rootroot00000000000000# Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *.test *.prof pgzip-1.2.6/.travis.yml000066400000000000000000000004751431554437500150030ustar00rootroot00000000000000 arch: - amd64 - ppc64le language: go os: - linux - osx go: - 1.13.x - 1.14.x - 1.15.x - master env: - GO111MODULE=off script: - diff <(gofmt -d .) <(printf "") - go test -v -cpu=1,2,4 . - go test -v -cpu=2 -race -short . matrix: allow_failures: - go: 'master' fast_finish: true pgzip-1.2.6/GO_LICENSE000066400000000000000000000027071431554437500142640ustar00rootroot00000000000000Copyright (c) 2012 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pgzip-1.2.6/LICENSE000066400000000000000000000020661431554437500136750ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Klaus Post Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pgzip-1.2.6/README.md000066400000000000000000000157711431554437500141560ustar00rootroot00000000000000pgzip ===== Go parallel gzip compression/decompression. This is a fully gzip compatible drop in replacement for "compress/gzip". This will split compression into blocks that are compressed in parallel. This can be useful for compressing big amounts of data. The output is a standard gzip file. The gzip decompression is modified so it decompresses ahead of the current reader. This means that reads will be non-blocking if the decompressor can keep ahead of your code reading from it. CRC calculation also takes place in a separate goroutine. You should only use this if you are (de)compressing big amounts of data, say **more than 1MB** at the time, otherwise you will not see any benefit, and it will likely be faster to use the internal gzip library or [this package](https://github.com/klauspost/compress). It is important to note that this library creates and reads *standard gzip files*. You do not have to match the compressor/decompressor to get the described speedups, and the gzip files are fully compatible with other gzip readers/writers. A golang variant of this is [bgzf](https://godoc.org/github.com/biogo/hts/bgzf), which has the same feature, as well as seeking in the resulting file. The only drawback is a slightly bigger overhead compared to this and pure gzip. See a comparison below. [![GoDoc][1]][2] [![Build Status][3]][4] [1]: https://godoc.org/github.com/klauspost/pgzip?status.svg [2]: https://godoc.org/github.com/klauspost/pgzip [3]: https://travis-ci.org/klauspost/pgzip.svg [4]: https://travis-ci.org/klauspost/pgzip Installation ==== ```go get github.com/klauspost/pgzip/...``` You might need to get/update the dependencies: ``` go get -u github.com/klauspost/compress ``` Usage ==== [Godoc Doumentation](https://godoc.org/github.com/klauspost/pgzip) To use as a replacement for gzip, exchange ```import "compress/gzip"``` with ```import gzip "github.com/klauspost/pgzip"```. # Changes * Oct 6, 2016: Fixed an issue if the destination writer returned an error. * Oct 6, 2016: Better buffer reuse, should now generate less garbage. * Oct 6, 2016: Output does not change based on write sizes. * Dec 8, 2015: Decoder now supports the io.WriterTo interface, giving a speedup and less GC pressure. * Oct 9, 2015: Reduced allocations by ~35 by using sync.Pool. ~15% overall speedup. Changes in [github.com/klauspost/compress](https://github.com/klauspost/compress#changelog) are also carried over, so see that for more changes. ## Compression The simplest way to use this is to simply do the same as you would when using [compress/gzip](http://golang.org/pkg/compress/gzip). To change the block size, use the added (*pgzip.Writer).SetConcurrency(blockSize, blocks int) function. With this you can control the approximate size of your blocks, as well as how many you want to be processing in parallel. Default values for this is SetConcurrency(1MB, runtime.GOMAXPROCS(0)), meaning blocks are split at 1 MB and up to the number of CPU threads blocks can be processing at once before the writer blocks. Example: ``` var b bytes.Buffer w := gzip.NewWriter(&b) w.SetConcurrency(100000, 10) w.Write([]byte("hello, world\n")) w.Close() ``` To get any performance gains, you should at least be compressing more than 1 megabyte of data at the time. You should at least have a block size of 100k and at least a number of blocks that match the number of cores your would like to utilize, but about twice the number of blocks would be the best. Another side effect of this is, that it is likely to speed up your other code, since writes to the compressor only blocks if the compressor is already compressing the number of blocks you have specified. This also means you don't have worry about buffering input to the compressor. ## Decompression Decompression works similar to compression. That means that you simply call pgzip the same way as you would call [compress/gzip](http://golang.org/pkg/compress/gzip). The only difference is that if you want to specify your own readahead, you have to use `pgzip.NewReaderN(r io.Reader, blockSize, blocks int)` to get a reader with your custom blocksizes. The `blockSize` is the size of each block decoded, and `blocks` is the maximum number of blocks that is decoded ahead. See [Example on playground](http://play.golang.org/p/uHv1B5NbDh) Performance ==== ## Compression See my blog post in [Benchmarks of Golang Gzip](https://blog.klauspost.com/go-gzipdeflate-benchmarks/). Compression cost is usually about 0.2% with default settings with a block size of 250k. Example with GOMAXPROC set to 32 (16 core CPU) Content is [Matt Mahoneys 10GB corpus](http://mattmahoney.net/dc/10gb.html). Compression level 6. Compressor | MB/sec | speedup | size | size overhead (lower=better) ------------|----------|---------|------|--------- [gzip](http://golang.org/pkg/compress/gzip) (golang) | 16.91MB/s (1 thread) | 1.0x | 4781329307 | 0% [gzip](http://github.com/klauspost/compress/gzip) (klauspost) | 127.10MB/s (1 thread) | 7.52x | 4885366806 | +2.17% [pgzip](https://github.com/klauspost/pgzip) (klauspost) | 2085.35MB/s| 123.34x | 4886132566 | +2.19% [pargzip](https://godoc.org/github.com/golang/build/pargzip) (builder) | 334.04MB/s | 19.76x | 4786890417 | +0.12% pgzip also contains a [huffman only compression](https://github.com/klauspost/compress#linear-time-compression-huffman-only) mode, that will allow compression at ~450MB per core per second, largely independent of the content. See the [complete sheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing) for different content types and compression settings. ## Decompression The decompression speedup is there because it allows you to do other work while the decompression is taking place. In the example above, the numbers are as follows on a 4 CPU machine: Decompressor | Time | Speedup -------------|------|-------- [gzip](http://golang.org/pkg/compress/gzip) (golang) | 1m28.85s | 0% [pgzip](https://github.com/klauspost/pgzip) (klauspost) | 43.48s | 104% But wait, since gzip decompression is inherently singlethreaded (aside from CRC calculation) how can it be more than 100% faster? Because pgzip due to its design also acts as a buffer. When using unbuffered gzip, you are also waiting for io when you are decompressing. If the gzip decoder can keep up, it will always have data ready for your reader, and you will not be waiting for input to the gzip decompressor to complete. This is pretty much an optimal situation for pgzip, but it reflects most common usecases for CPU intensive gzip usage. I haven't included [bgzf](https://godoc.org/github.com/biogo/hts/bgzf) in this comparison, since it only can decompress files created by a compatible encoder, and therefore cannot be considered a generic gzip decompressor. But if you are able to compress your files with a bgzf compatible program, you can expect it to scale beyond 100%. # License This contains large portions of code from the go repository - see GO_LICENSE for more information. The changes are released under MIT License. See LICENSE for more information. pgzip-1.2.6/gunzip.go000066400000000000000000000330521431554437500145320ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package pgzip implements reading and writing of gzip format compressed files, // as specified in RFC 1952. // // This is a drop in replacement for "compress/gzip". // This will split compression into blocks that are compressed in parallel. // This can be useful for compressing big amounts of data. // The gzip decompression has not been modified, but remains in the package, // so you can use it as a complete replacement for "compress/gzip". // // See more at https://github.com/klauspost/pgzip package pgzip import ( "bufio" "errors" "hash" "hash/crc32" "io" "sync" "time" "github.com/klauspost/compress/flate" ) const ( gzipID1 = 0x1f gzipID2 = 0x8b gzipDeflate = 8 flagText = 1 << 0 flagHdrCrc = 1 << 1 flagExtra = 1 << 2 flagName = 1 << 3 flagComment = 1 << 4 ) func makeReader(r io.Reader) flate.Reader { if rr, ok := r.(flate.Reader); ok { return rr } return bufio.NewReader(r) } var ( // ErrChecksum is returned when reading GZIP data that has an invalid checksum. ErrChecksum = errors.New("gzip: invalid checksum") // ErrHeader is returned when reading GZIP data that has an invalid header. ErrHeader = errors.New("gzip: invalid header") ) // The gzip file stores a header giving metadata about the compressed file. // That header is exposed as the fields of the Writer and Reader structs. type Header struct { Comment string // comment Extra []byte // "extra data" ModTime time.Time // modification time Name string // file name OS byte // operating system type } // A Reader is an io.Reader that can be read to retrieve // uncompressed data from a gzip-format compressed file. // // In general, a gzip file can be a concatenation of gzip files, // each with its own header. Reads from the Reader // return the concatenation of the uncompressed data of each. // Only the first header is recorded in the Reader fields. // // Gzip files store a length and checksum of the uncompressed data. // The Reader will return a ErrChecksum when Read // reaches the end of the uncompressed data if it does not // have the expected length or checksum. Clients should treat data // returned by Read as tentative until they receive the io.EOF // marking the end of the data. type Reader struct { Header r flate.Reader decompressor io.ReadCloser digest hash.Hash32 size uint32 flg byte buf [512]byte err error closeErr chan error multistream bool readAhead chan read roff int // read offset current []byte closeReader chan struct{} lastBlock bool blockSize int blocks int activeRA bool // Indication if readahead is active mu sync.Mutex // Lock for above blockPool chan []byte } type read struct { b []byte err error } // NewReader creates a new Reader reading the given reader. // The implementation buffers input and may read more data than necessary from r. // It is the caller's responsibility to call Close on the Reader when done. func NewReader(r io.Reader) (*Reader, error) { z := new(Reader) z.blocks = defaultBlocks z.blockSize = defaultBlockSize z.r = makeReader(r) z.digest = crc32.NewIEEE() z.multistream = true z.blockPool = make(chan []byte, z.blocks) for i := 0; i < z.blocks; i++ { z.blockPool <- make([]byte, z.blockSize) } if err := z.readHeader(true); err != nil { return nil, err } return z, nil } // NewReaderN creates a new Reader reading the given reader. // The implementation buffers input and may read more data than necessary from r. // It is the caller's responsibility to call Close on the Reader when done. // // With this you can control the approximate size of your blocks, // as well as how many blocks you want to have prefetched. // // Default values for this is blockSize = 250000, blocks = 16, // meaning up to 16 blocks of maximum 250000 bytes will be // prefetched. func NewReaderN(r io.Reader, blockSize, blocks int) (*Reader, error) { z := new(Reader) z.blocks = blocks z.blockSize = blockSize z.r = makeReader(r) z.digest = crc32.NewIEEE() z.multistream = true // Account for too small values if z.blocks <= 0 { z.blocks = defaultBlocks } if z.blockSize <= 512 { z.blockSize = defaultBlockSize } z.blockPool = make(chan []byte, z.blocks) for i := 0; i < z.blocks; i++ { z.blockPool <- make([]byte, z.blockSize) } if err := z.readHeader(true); err != nil { return nil, err } return z, nil } // Reset discards the Reader z's state and makes it equivalent to the // result of its original state from NewReader, but reading from r instead. // This permits reusing a Reader rather than allocating a new one. func (z *Reader) Reset(r io.Reader) error { z.killReadAhead() z.r = makeReader(r) z.digest = crc32.NewIEEE() z.size = 0 z.err = nil z.multistream = true // Account for uninitialized values if z.blocks <= 0 { z.blocks = defaultBlocks } if z.blockSize <= 512 { z.blockSize = defaultBlockSize } if z.blockPool == nil { z.blockPool = make(chan []byte, z.blocks) for i := 0; i < z.blocks; i++ { z.blockPool <- make([]byte, z.blockSize) } } return z.readHeader(true) } // Multistream controls whether the reader supports multistream files. // // If enabled (the default), the Reader expects the input to be a sequence // of individually gzipped data streams, each with its own header and // trailer, ending at EOF. The effect is that the concatenation of a sequence // of gzipped files is treated as equivalent to the gzip of the concatenation // of the sequence. This is standard behavior for gzip readers. // // Calling Multistream(false) disables this behavior; disabling the behavior // can be useful when reading file formats that distinguish individual gzip // data streams or mix gzip data streams with other data streams. // In this mode, when the Reader reaches the end of the data stream, // Read returns io.EOF. If the underlying reader implements io.ByteReader, // it will be left positioned just after the gzip stream. // To start the next stream, call z.Reset(r) followed by z.Multistream(false). // If there is no next stream, z.Reset(r) will return io.EOF. func (z *Reader) Multistream(ok bool) { z.multistream = ok } // GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950). func get4(p []byte) uint32 { return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 } func (z *Reader) readString() (string, error) { var err error needconv := false for i := 0; ; i++ { if i >= len(z.buf) { return "", ErrHeader } z.buf[i], err = z.r.ReadByte() if err != nil { return "", err } if z.buf[i] > 0x7f { needconv = true } if z.buf[i] == 0 { // GZIP (RFC 1952) specifies that strings are NUL-terminated ISO 8859-1 (Latin-1). if needconv { s := make([]rune, 0, i) for _, v := range z.buf[0:i] { s = append(s, rune(v)) } return string(s), nil } return string(z.buf[0:i]), nil } } } func (z *Reader) read2() (uint32, error) { _, err := io.ReadFull(z.r, z.buf[0:2]) if err != nil { return 0, err } return uint32(z.buf[0]) | uint32(z.buf[1])<<8, nil } func (z *Reader) readHeader(save bool) error { z.killReadAhead() _, err := io.ReadFull(z.r, z.buf[0:10]) if err != nil { return err } if z.buf[0] != gzipID1 || z.buf[1] != gzipID2 || z.buf[2] != gzipDeflate { return ErrHeader } z.flg = z.buf[3] if save { z.ModTime = time.Unix(int64(get4(z.buf[4:8])), 0) // z.buf[8] is xfl, ignored z.OS = z.buf[9] } z.digest.Reset() z.digest.Write(z.buf[0:10]) if z.flg&flagExtra != 0 { n, err := z.read2() if err != nil { return err } data := make([]byte, n) if _, err = io.ReadFull(z.r, data); err != nil { return err } if save { z.Extra = data } } var s string if z.flg&flagName != 0 { if s, err = z.readString(); err != nil { return err } if save { z.Name = s } } if z.flg&flagComment != 0 { if s, err = z.readString(); err != nil { return err } if save { z.Comment = s } } if z.flg&flagHdrCrc != 0 { n, err := z.read2() if err != nil { return err } sum := z.digest.Sum32() & 0xFFFF if n != sum { return ErrHeader } } z.digest.Reset() z.decompressor = flate.NewReader(z.r) z.doReadAhead() return nil } func (z *Reader) killReadAhead() error { z.mu.Lock() defer z.mu.Unlock() if z.activeRA { if z.closeReader != nil { close(z.closeReader) } // Wait for decompressor to be closed and return error, if any. e, ok := <-z.closeErr z.activeRA = false for blk := range z.readAhead { if blk.b != nil { z.blockPool <- blk.b } } if cap(z.current) > 0 { z.blockPool <- z.current z.current = nil } if !ok { // Channel is closed, so if there was any error it has already been returned. return nil } return e } return nil } // Starts readahead. // Will return on error (including io.EOF) // or when z.closeReader is closed. func (z *Reader) doReadAhead() { z.mu.Lock() defer z.mu.Unlock() z.activeRA = true if z.blocks <= 0 { z.blocks = defaultBlocks } if z.blockSize <= 512 { z.blockSize = defaultBlockSize } ra := make(chan read, z.blocks) z.readAhead = ra closeReader := make(chan struct{}, 0) z.closeReader = closeReader z.lastBlock = false closeErr := make(chan error, 1) z.closeErr = closeErr z.size = 0 z.roff = 0 z.current = nil decomp := z.decompressor go func() { defer func() { closeErr <- decomp.Close() close(closeErr) close(ra) }() // We hold a local reference to digest, since // it way be changed by reset. digest := z.digest var wg sync.WaitGroup for { var buf []byte select { case buf = <-z.blockPool: case <-closeReader: return } buf = buf[0:z.blockSize] // Try to fill the buffer n, err := io.ReadFull(decomp, buf) if err == io.ErrUnexpectedEOF { if n > 0 { err = nil } else { // If we got zero bytes, we need to establish if // we reached end of stream or truncated stream. _, err = decomp.Read([]byte{}) if err == io.EOF { err = nil } } } if n < len(buf) { buf = buf[0:n] } wg.Wait() wg.Add(1) go func() { digest.Write(buf) wg.Done() }() z.size += uint32(n) // If we return any error, out digest must be ready if err != nil { wg.Wait() } select { case z.readAhead <- read{b: buf, err: err}: case <-closeReader: // Sent on close, we don't care about the next results z.blockPool <- buf return } if err != nil { return } } }() } func (z *Reader) Read(p []byte) (n int, err error) { if z.err != nil { return 0, z.err } if len(p) == 0 { return 0, nil } for { if len(z.current) == 0 && !z.lastBlock { read := <-z.readAhead if read.err != nil { // If not nil, the reader will have exited z.closeReader = nil if read.err != io.EOF { z.err = read.err return } if read.err == io.EOF { z.lastBlock = true err = nil } } z.current = read.b z.roff = 0 } avail := z.current[z.roff:] if len(p) >= len(avail) { // If len(p) >= len(current), return all content of current n = copy(p, avail) z.blockPool <- z.current z.current = nil if z.lastBlock { err = io.EOF break } } else { // We copy as much as there is space for n = copy(p, avail) z.roff += n } return } // Finished file; check checksum + size. if _, err := io.ReadFull(z.r, z.buf[0:8]); err != nil { z.err = err return 0, err } crc32, isize := get4(z.buf[0:4]), get4(z.buf[4:8]) sum := z.digest.Sum32() if sum != crc32 || isize != z.size { z.err = ErrChecksum return 0, z.err } // File is ok; should we attempt reading one more? if !z.multistream { return 0, io.EOF } // Is there another? if err = z.readHeader(false); err != nil { z.err = err return } // Yes. Reset and read from it. return z.Read(p) } func (z *Reader) WriteTo(w io.Writer) (n int64, err error) { total := int64(0) avail := z.current[z.roff:] if len(avail) != 0 { n, err := w.Write(avail) if n != len(avail) { return total, io.ErrShortWrite } total += int64(n) if err != nil { return total, err } z.blockPool <- z.current z.current = nil } for { if z.err != nil { return total, z.err } // We write both to output and digest. for { // Read from input read := <-z.readAhead if read.err != nil { // If not nil, the reader will have exited z.closeReader = nil if read.err != io.EOF { z.err = read.err return total, z.err } if read.err == io.EOF { z.lastBlock = true err = nil } } // Write what we got n, err := w.Write(read.b) if n != len(read.b) { return total, io.ErrShortWrite } total += int64(n) if err != nil { return total, err } // Put block back z.blockPool <- read.b if z.lastBlock { break } } // Finished file; check checksum + size. if _, err := io.ReadFull(z.r, z.buf[0:8]); err != nil { z.err = err return total, err } crc32, isize := get4(z.buf[0:4]), get4(z.buf[4:8]) sum := z.digest.Sum32() if sum != crc32 || isize != z.size { z.err = ErrChecksum return total, z.err } // File is ok; should we attempt reading one more? if !z.multistream { return total, nil } // Is there another? err = z.readHeader(false) if err == io.EOF { return total, nil } if err != nil { z.err = err return total, err } } } // Close closes the Reader. It does not close the underlying io.Reader. func (z *Reader) Close() error { return z.killReadAhead() } pgzip-1.2.6/gunzip_test.go000066400000000000000000000525701431554437500155770ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package pgzip import ( "bytes" oldgz "compress/gzip" "crypto/rand" "io" "io/ioutil" "os" "runtime/pprof" "strings" "testing" "time" kpgzip "github.com/klauspost/compress/gzip" ) type gunzipTest struct { name string desc string raw string gzip []byte err error } var gunzipTests = []gunzipTest{ { // has 1 empty fixed-huffman block "empty.txt", "empty.txt", "", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a, 0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, nil, }, { // has 1 non-empty fixed huffman block "hello.txt", "hello.txt", "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00, 0x00, 0x00, }, nil, }, { // concatenation "hello.txt", "hello.txt x2", "hello world\n" + "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00, 0x00, 0x00, }, nil, }, { // has a fixed huffman block with some length-distance pairs "shesells.txt", "shesells.txt", "she sells seashells by the seashore\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a, 0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c, 0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b, 0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29, 0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52, 0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f, 0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb, 0x24, 0x00, 0x00, 0x00, }, nil, }, { // has dynamic huffman blocks "gettysburg", "gettysburg", " Four score and seven years ago our fathers brought forth on\n" + "this continent, a new nation, conceived in Liberty, and dedicated\n" + "to the proposition that all men are created equal.\n" + " Now we are engaged in a great Civil War, testing whether that\n" + "nation, or any nation so conceived and so dedicated, can long\n" + "endure.\n" + " We are met on a great battle-field of that war.\n" + " We have come to dedicate a portion of that field, as a final\n" + "resting place for those who here gave their lives that that\n" + "nation might live. It is altogether fitting and proper that\n" + "we should do this.\n" + " But, in a larger sense, we can not dedicate — we can not\n" + "consecrate — we can not hallow — this ground.\n" + " The brave men, living and dead, who struggled here, have\n" + "consecrated it, far above our poor power to add or detract.\n" + "The world will little note, nor long remember what we say here,\n" + "but it can never forget what they did here.\n" + " It is for us the living, rather, to be dedicated here to the\n" + "unfinished work which they who fought here have thus far so\n" + "nobly advanced. It is rather for us to be here dedicated to\n" + "the great task remaining before us — that from these honored\n" + "dead we take increased devotion to that cause for which they\n" + "gave the last full measure of devotion —\n" + " that we here highly resolve that these dead shall not have\n" + "died in vain — that this nation, under God, shall have a new\n" + "birth of freedom — and that government of the people, by the\n" + "people, for the people, shall not perish from this earth.\n" + "\n" + "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a, 0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73, 0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd, 0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6, 0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90, 0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24, 0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76, 0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c, 0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c, 0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb, 0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9, 0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9, 0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75, 0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26, 0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92, 0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35, 0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f, 0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0, 0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55, 0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60, 0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02, 0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9, 0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5, 0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03, 0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48, 0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1, 0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78, 0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f, 0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38, 0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62, 0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1, 0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83, 0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf, 0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea, 0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc, 0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff, 0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93, 0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09, 0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53, 0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7, 0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a, 0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87, 0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17, 0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac, 0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1, 0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83, 0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf, 0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91, 0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5, 0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7, 0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84, 0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a, 0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec, 0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8, 0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21, 0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa, 0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f, 0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf, 0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2, 0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9, 0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1, 0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3, 0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b, 0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8, 0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93, 0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28, 0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96, 0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27, 0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73, 0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13, 0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4, 0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6, 0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50, 0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9, 0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6, 0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a, 0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3, 0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71, 0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef, 0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd, 0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54, 0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31, 0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb, 0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a, 0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84, 0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c, 0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96, 0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57, 0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87, 0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2, 0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b, 0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63, 0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd, 0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01, 0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15, 0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91, 0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80, 0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06, 0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5, 0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48, 0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f, 0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00, }, nil, }, { // has 1 non-empty fixed huffman block then garbage "hello.txt", "hello.txt + garbage", "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00, 0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!', }, ErrHeader, }, { // has 1 non-empty fixed huffman block not enough header "hello.txt", "hello.txt + garbage", "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00, 0x00, 0x00, gzipID1, }, io.ErrUnexpectedEOF, }, { // has 1 non-empty fixed huffman block but corrupt checksum "hello.txt", "hello.txt + corrupt checksum", "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, }, ErrChecksum, }, { // has 1 non-empty fixed huffman block but corrupt size "hello.txt", "hello.txt + corrupt size", "hello world\n", []byte{ 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a, 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00, 0x00, 0x00, }, ErrChecksum, }, } func TestDecompressor(t *testing.T) { b := new(bytes.Buffer) for _, tt := range gunzipTests { in := bytes.NewReader(tt.gzip) gzip, err := NewReader(in) if err != nil { t.Errorf("%s: NewReader: %s", tt.name, err) continue } defer gzip.Close() if tt.name != gzip.Name { t.Errorf("%s: got name %s", tt.name, gzip.Name) } b.Reset() n, err := io.Copy(b, gzip) if err != tt.err { t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err) } s := b.String() if s != tt.raw { t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw) } // Test Reader Reset. in = bytes.NewReader(tt.gzip) err = gzip.Reset(in) if err != nil { t.Errorf("%s: Reset: %s", tt.name, err) continue } if tt.name != gzip.Name { t.Errorf("%s: got name %s", tt.name, gzip.Name) } b.Reset() n, err = io.Copy(b, gzip) if err != tt.err { t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err) } s = b.String() if s != tt.raw { t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw) } } } func TestDecompressorReset(t *testing.T) { b := new(bytes.Buffer) var gzip *Reader for _, tt := range gunzipTests { in := bytes.NewReader(tt.gzip) if gzip == nil { var err error gzip, err = NewReader(in) if err != nil { t.Fatalf("NewReader: %s", err) } defer gzip.Close() } else { err := gzip.Reset(in) if err != nil { t.Errorf("%s: Reset: %s", tt.name, err) continue } } if tt.name != gzip.Name { t.Errorf("%s: got name %s", tt.name, gzip.Name) } b.Reset() n, err := io.Copy(b, gzip) if err != tt.err { t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err) } s := b.String() if s != tt.raw { t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw) } // Test Reader Reset. in = bytes.NewReader(tt.gzip) err = gzip.Reset(in) if err != nil { t.Errorf("%s: Reset: %s", tt.name, err) continue } if tt.name != gzip.Name { t.Errorf("%s: got name %s", tt.name, gzip.Name) } b.Reset() n, err = io.Copy(b, gzip) if err != tt.err { t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err) } s = b.String() if s != tt.raw { t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw) } } } func TestDecompressorResetNoRead(t *testing.T) { done := make(chan struct{}) defer close(done) go func() { select { // Typical runtime is 2-3s, so we add an order of magnitude. case <-time.After(30 * time.Second): pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) case <-done: } }() in, err := ioutil.ReadFile("testdata/bigempty.gz") if err != nil { t.Fatal(err) } gz, err := NewReader(bytes.NewBuffer(in)) if err != nil { t.Fatal(err) } for i := 0; i < 100; i++ { if testing.Short() && i > 10 { break } err := gz.Reset(bytes.NewBuffer(in)) if err != nil { t.Fatal(i, err) } // Read 100KB, ignore the rest lr := io.LimitedReader{N: 100 << 10, R: gz} _, err = io.Copy(ioutil.Discard, &lr) if err != nil { t.Fatal(i, err) } } } func TestIssue6550(t *testing.T) { f, err := os.Open("testdata/issue6550.gz") if err != nil { t.Fatal(err) } gzip, err := NewReader(f) if err != nil { t.Fatalf("NewReader(testdata/issue6550.gz): %v", err) } defer gzip.Close() done := make(chan bool, 1) go func() { _, err := io.Copy(ioutil.Discard, gzip) if err == nil { t.Errorf("Copy succeeded") } else { t.Logf("Copy failed (correctly): %v", err) } done <- true }() select { case <-time.After(1 * time.Second): t.Errorf("Copy hung") case <-done: // ok } } func TestInitialReset(t *testing.T) { var r Reader if err := r.Reset(bytes.NewReader(gunzipTests[1].gzip)); err != nil { t.Error(err) } var buf bytes.Buffer if _, err := io.Copy(&buf, &r); err != nil { t.Error(err) } if s := buf.String(); s != gunzipTests[1].raw { t.Errorf("got %q want %q", s, gunzipTests[1].raw) } } func TestMultistreamFalse(t *testing.T) { // Find concatenation test. var tt gunzipTest for _, tt = range gunzipTests { if strings.HasSuffix(tt.desc, " x2") { goto Found } } t.Fatal("cannot find hello.txt x2 in gunzip tests") Found: br := bytes.NewReader(tt.gzip) var r Reader if err := r.Reset(br); err != nil { t.Fatalf("first reset: %v", err) } // Expect two streams with "hello world\n", then real EOF. const hello = "hello world\n" r.Multistream(false) data, err := ioutil.ReadAll(&r) if string(data) != hello || err != nil { t.Fatalf("first stream = %q, %v, want %q, %v", string(data), err, hello, nil) } if err := r.Reset(br); err != nil { t.Fatalf("second reset: %v", err) } r.Multistream(false) data, err = ioutil.ReadAll(&r) if string(data) != hello || err != nil { t.Fatalf("second stream = %q, %v, want %q, %v", string(data), err, hello, nil) } if err := r.Reset(br); err != io.EOF { t.Fatalf("third reset: err=%v, want io.EOF", err) } } func TestWriteTo(t *testing.T) { input := make([]byte, 100000) n, err := rand.Read(input) if err != nil { t.Fatal(err) } if n != len(input) { t.Fatal("did not fill buffer") } compressed := &bytes.Buffer{} // Do it twice to test MultiStream functionality for i := 0; i < 2; i++ { w, err := NewWriterLevel(compressed, -2) if err != nil { t.Fatal(err) } n, err = w.Write(input) if err != nil { t.Fatal(err) } if n != len(input) { t.Fatal("did not fill buffer") } w.Close() } input = append(input, input...) buf := compressed.Bytes() dec, err := NewReader(bytes.NewBuffer(buf)) if err != nil { t.Fatal(err) } // ReadAll does not use WriteTo, but we wrap it in a NopCloser to be sure. readall, err := ioutil.ReadAll(ioutil.NopCloser(dec)) if err != nil { t.Fatal(err) } if len(readall) != len(input) { t.Fatal("did not decompress everything") } if bytes.Compare(readall, input) != 0 { t.Fatal("output did not match input") } dec, err = NewReader(bytes.NewBuffer(buf)) if err != nil { t.Fatal(err) } wtbuf := &bytes.Buffer{} written, err := dec.WriteTo(wtbuf) if err != nil { t.Fatal(err) } if written != int64(len(input)) { t.Error("Returned length did not match, expected", len(input), "got", written) } if wtbuf.Len() != len(input) { t.Error("Actual Length did not match, expected", len(input), "got", wtbuf.Len()) } if bytes.Compare(wtbuf.Bytes(), input) != 0 { t.Fatal("output did not match input") } } func BenchmarkGunzipCopy(b *testing.B) { dat, _ := ioutil.ReadFile("testdata/test.json") dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dst := &bytes.Buffer{} w, _ := NewWriterLevel(dst, 1) _, err := w.Write(dat) if err != nil { b.Fatal(err) } w.Close() input := dst.Bytes() r, err := NewReader(bytes.NewBuffer(input)) b.SetBytes(int64(len(dat))) b.ResetTimer() for n := 0; n < b.N; n++ { err = r.Reset(bytes.NewBuffer(input)) if err != nil { b.Fatal(err) } _, err = io.Copy(ioutil.Discard, r) if err != nil { b.Fatal(err) } } } func BenchmarkGunzipReadAll(b *testing.B) { dat, _ := ioutil.ReadFile("testdata/test.json") dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dst := &bytes.Buffer{} w, _ := NewWriterLevel(dst, 1) _, err := w.Write(dat) if err != nil { b.Fatal(err) } w.Close() input := dst.Bytes() r, err := NewReader(bytes.NewBuffer(input)) b.SetBytes(int64(len(dat))) b.ResetTimer() for n := 0; n < b.N; n++ { err = r.Reset(bytes.NewBuffer(input)) if err != nil { b.Fatal(err) } _, err = ioutil.ReadAll(ioutil.NopCloser(r)) if err != nil { b.Fatal(err) } } } func BenchmarkGunzipStdLib(b *testing.B) { dat, _ := ioutil.ReadFile("testdata/test.json") dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dst := &bytes.Buffer{} w, _ := NewWriterLevel(dst, 1) _, err := w.Write(dat) if err != nil { b.Fatal(err) } w.Close() input := dst.Bytes() r, err := oldgz.NewReader(bytes.NewBuffer(input)) b.SetBytes(int64(len(dat))) b.ResetTimer() for n := 0; n < b.N; n++ { err = r.Reset(bytes.NewBuffer(input)) if err != nil { b.Fatal(err) } _, err = io.Copy(ioutil.Discard, r) if err != nil { b.Fatal(err) } } } func BenchmarkGunzipFlate(b *testing.B) { dat, _ := ioutil.ReadFile("testdata/test.json") dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dst := &bytes.Buffer{} w, _ := NewWriterLevel(dst, 1) _, err := w.Write(dat) if err != nil { b.Fatal(err) } w.Close() input := dst.Bytes() r, err := kpgzip.NewReader(bytes.NewBuffer(input)) b.SetBytes(int64(len(dat))) b.ResetTimer() for n := 0; n < b.N; n++ { err = r.Reset(bytes.NewBuffer(input)) if err != nil { b.Fatal(err) } _, err = io.Copy(ioutil.Discard, r) if err != nil { b.Fatal(err) } } } func TestTruncatedGunzip(t *testing.T) { in := []byte(strings.Repeat("ASDFASDFASDFASDFASDF", 1000)) var buf bytes.Buffer enc := kpgzip.NewWriter(&buf) _, err := enc.Write(in) if err != nil { t.Fatal(err) } enc.Close() testdata := buf.Bytes() for i := 5; i < len(testdata); i += 10 { timer := time.NewTimer(time.Second) done := make(chan struct{}) fail := make(chan struct{}) go func() { r, err := NewReader(bytes.NewBuffer(testdata[:i])) if err == nil { b, err := ioutil.ReadAll(r) if err == nil && !bytes.Equal(testdata[:i], b) { close(fail) } } close(done) }() select { case <-timer.C: t.Fatal("Timeout decoding") case <-fail: t.Fatal("No error, but mismatch") case <-done: timer.Stop() } } } func TestTruncatedGunzipBlocks(t *testing.T) { var in = make([]byte, 512*10) rand.Read(in) var buf bytes.Buffer for i := 0; i < len(in); i += 512 { enc, _ := kpgzip.NewWriterLevel(&buf, 0) _, err := enc.Write(in[:i]) if err != nil { t.Fatal(err) } enc.Close() timer := time.NewTimer(time.Second) done := make(chan struct{}) fail := make(chan struct{}) go func() { r, err := NewReaderN(&buf, 512, 10) if err == nil { b, err := ioutil.ReadAll(r) if err == nil && !bytes.Equal(b, in[:i]) { close(fail) } } close(done) }() select { case <-timer.C: t.Fatal("Timeout decoding") case <-fail: t.Fatal("No error, but mismatch") case <-done: timer.Stop() } } } pgzip-1.2.6/gzip.go000066400000000000000000000316411431554437500141710ustar00rootroot00000000000000// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package pgzip import ( "bytes" "errors" "fmt" "hash" "hash/crc32" "io" "runtime" "sync" "time" "github.com/klauspost/compress/flate" ) const ( defaultBlockSize = 1 << 20 tailSize = 16384 defaultBlocks = 4 ) // These constants are copied from the flate package, so that code that imports // "compress/gzip" does not also have to import "compress/flate". const ( NoCompression = flate.NoCompression BestSpeed = flate.BestSpeed BestCompression = flate.BestCompression DefaultCompression = flate.DefaultCompression ConstantCompression = flate.ConstantCompression HuffmanOnly = flate.HuffmanOnly ) // A Writer is an io.WriteCloser. // Writes to a Writer are compressed and written to w. type Writer struct { Header w io.Writer level int wroteHeader bool blockSize int blocks int currentBuffer []byte prevTail []byte digest hash.Hash32 size int closed bool buf [10]byte errMu sync.RWMutex err error pushedErr chan struct{} results chan result dictFlatePool sync.Pool dstPool sync.Pool wg sync.WaitGroup } type result struct { result chan []byte notifyWritten chan struct{} } // Use SetConcurrency to finetune the concurrency level if needed. // // With this you can control the approximate size of your blocks, // as well as how many you want to be processing in parallel. // // Default values for this is SetConcurrency(defaultBlockSize, runtime.GOMAXPROCS(0)), // meaning blocks are split at 1 MB and up to the number of CPU threads // can be processing at once before the writer blocks. func (z *Writer) SetConcurrency(blockSize, blocks int) error { if blockSize <= tailSize { return fmt.Errorf("gzip: block size cannot be less than or equal to %d", tailSize) } if blocks <= 0 { return errors.New("gzip: blocks cannot be zero or less") } if blockSize == z.blockSize && blocks == z.blocks { return nil } z.blockSize = blockSize z.results = make(chan result, blocks) z.blocks = blocks z.dstPool.New = func() interface{} { return make([]byte, 0, blockSize+(blockSize)>>4) } return nil } // NewWriter returns a new Writer. // Writes to the returned writer are compressed and written to w. // // It is the caller's responsibility to call Close on the WriteCloser when done. // Writes may be buffered and not flushed until Close. // // Callers that wish to set the fields in Writer.Header must do so before // the first call to Write or Close. The Comment and Name header fields are // UTF-8 strings in Go, but the underlying format requires NUL-terminated ISO // 8859-1 (Latin-1). NUL or non-Latin-1 runes in those strings will lead to an // error on Write. func NewWriter(w io.Writer) *Writer { z, _ := NewWriterLevel(w, DefaultCompression) return z } // NewWriterLevel is like NewWriter but specifies the compression level instead // of assuming DefaultCompression. // // The compression level can be DefaultCompression, NoCompression, or any // integer value between BestSpeed and BestCompression inclusive. The error // returned will be nil if the level is valid. func NewWriterLevel(w io.Writer, level int) (*Writer, error) { if level < ConstantCompression || level > BestCompression { return nil, fmt.Errorf("gzip: invalid compression level: %d", level) } z := new(Writer) z.SetConcurrency(defaultBlockSize, runtime.GOMAXPROCS(0)) z.init(w, level) return z, nil } // This function must be used by goroutines to set an // error condition, since z.err access is restricted // to the callers goruotine. func (z *Writer) pushError(err error) { z.errMu.Lock() if z.err != nil { z.errMu.Unlock() return } z.err = err close(z.pushedErr) z.errMu.Unlock() } func (z *Writer) init(w io.Writer, level int) { z.wg.Wait() digest := z.digest if digest != nil { digest.Reset() } else { digest = crc32.NewIEEE() } z.Header = Header{OS: 255} z.w = w z.level = level z.digest = digest z.pushedErr = make(chan struct{}, 0) z.results = make(chan result, z.blocks) z.err = nil z.closed = false z.Comment = "" z.Extra = nil z.ModTime = time.Time{} z.wroteHeader = false z.currentBuffer = nil z.buf = [10]byte{} z.prevTail = nil z.size = 0 if z.dictFlatePool.New == nil { z.dictFlatePool.New = func() interface{} { f, _ := flate.NewWriterDict(w, level, nil) return f } } } // Reset discards the Writer z's state and makes it equivalent to the // result of its original state from NewWriter or NewWriterLevel, but // writing to w instead. This permits reusing a Writer rather than // allocating a new one. func (z *Writer) Reset(w io.Writer) { if z.results != nil && !z.closed { close(z.results) } z.SetConcurrency(defaultBlockSize, runtime.GOMAXPROCS(0)) z.init(w, z.level) } // GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950). func put2(p []byte, v uint16) { p[0] = uint8(v >> 0) p[1] = uint8(v >> 8) } func put4(p []byte, v uint32) { p[0] = uint8(v >> 0) p[1] = uint8(v >> 8) p[2] = uint8(v >> 16) p[3] = uint8(v >> 24) } // writeBytes writes a length-prefixed byte slice to z.w. func (z *Writer) writeBytes(b []byte) error { if len(b) > 0xffff { return errors.New("gzip.Write: Extra data is too large") } put2(z.buf[0:2], uint16(len(b))) _, err := z.w.Write(z.buf[0:2]) if err != nil { return err } _, err = z.w.Write(b) return err } // writeString writes a UTF-8 string s in GZIP's format to z.w. // GZIP (RFC 1952) specifies that strings are NUL-terminated ISO 8859-1 (Latin-1). func (z *Writer) writeString(s string) (err error) { // GZIP stores Latin-1 strings; error if non-Latin-1; convert if non-ASCII. needconv := false for _, v := range s { if v == 0 || v > 0xff { return errors.New("gzip.Write: non-Latin-1 header string") } if v > 0x7f { needconv = true } } if needconv { b := make([]byte, 0, len(s)) for _, v := range s { b = append(b, byte(v)) } _, err = z.w.Write(b) } else { _, err = io.WriteString(z.w, s) } if err != nil { return err } // GZIP strings are NUL-terminated. z.buf[0] = 0 _, err = z.w.Write(z.buf[0:1]) return err } // compressCurrent will compress the data currently buffered // This should only be called from the main writer/flush/closer func (z *Writer) compressCurrent(flush bool) { c := z.currentBuffer if len(c) > z.blockSize { // This can never happen through the public interface. panic("len(z.currentBuffer) > z.blockSize (most likely due to concurrent Write race)") } r := result{} r.result = make(chan []byte, 1) r.notifyWritten = make(chan struct{}, 0) // Reserve a result slot select { case z.results <- r: case <-z.pushedErr: return } z.wg.Add(1) tail := z.prevTail if len(c) > tailSize { buf := z.dstPool.Get().([]byte) // Put in .compressBlock // Copy tail from current buffer before handing the buffer over to the // compressBlock goroutine. buf = append(buf[:0], c[len(c)-tailSize:]...) z.prevTail = buf } else { z.prevTail = nil } go z.compressBlock(c, tail, r, z.closed) z.currentBuffer = z.dstPool.Get().([]byte) // Put in .compressBlock z.currentBuffer = z.currentBuffer[:0] // Wait if flushing if flush { <-r.notifyWritten } } // Returns an error if it has been set. // Cannot be used by functions that are from internal goroutines. func (z *Writer) checkError() error { z.errMu.RLock() err := z.err z.errMu.RUnlock() return err } // Write writes a compressed form of p to the underlying io.Writer. The // compressed bytes are not necessarily flushed to output until // the Writer is closed or Flush() is called. // // The function will return quickly, if there are unused buffers. // The sent slice (p) is copied, and the caller is free to re-use the buffer // when the function returns. // // Errors that occur during compression will be reported later, and a nil error // does not signify that the compression succeeded (since it is most likely still running) // That means that the call that returns an error may not be the call that caused it. // Only Flush and Close functions are guaranteed to return any errors up to that point. func (z *Writer) Write(p []byte) (int, error) { if err := z.checkError(); err != nil { return 0, err } // Write the GZIP header lazily. if !z.wroteHeader { z.wroteHeader = true z.buf[0] = gzipID1 z.buf[1] = gzipID2 z.buf[2] = gzipDeflate z.buf[3] = 0 if z.Extra != nil { z.buf[3] |= 0x04 } if z.Name != "" { z.buf[3] |= 0x08 } if z.Comment != "" { z.buf[3] |= 0x10 } put4(z.buf[4:8], uint32(z.ModTime.Unix())) if z.level == BestCompression { z.buf[8] = 2 } else if z.level == BestSpeed { z.buf[8] = 4 } else { z.buf[8] = 0 } z.buf[9] = z.OS var n int var err error n, err = z.w.Write(z.buf[0:10]) if err != nil { z.pushError(err) return n, err } if z.Extra != nil { err = z.writeBytes(z.Extra) if err != nil { z.pushError(err) return n, err } } if z.Name != "" { err = z.writeString(z.Name) if err != nil { z.pushError(err) return n, err } } if z.Comment != "" { err = z.writeString(z.Comment) if err != nil { z.pushError(err) return n, err } } // Start receiving data from compressors go func() { listen := z.results var failed bool for { r, ok := <-listen // If closed, we are finished. if !ok { return } if failed { close(r.notifyWritten) continue } buf := <-r.result n, err := z.w.Write(buf) if err != nil { z.pushError(err) close(r.notifyWritten) failed = true continue } if n != len(buf) { z.pushError(fmt.Errorf("gzip: short write %d should be %d", n, len(buf))) failed = true close(r.notifyWritten) continue } z.dstPool.Put(buf) close(r.notifyWritten) } }() z.currentBuffer = z.dstPool.Get().([]byte) z.currentBuffer = z.currentBuffer[:0] } q := p for len(q) > 0 { length := len(q) if length+len(z.currentBuffer) > z.blockSize { length = z.blockSize - len(z.currentBuffer) } z.digest.Write(q[:length]) z.currentBuffer = append(z.currentBuffer, q[:length]...) if len(z.currentBuffer) > z.blockSize { panic("z.currentBuffer too large (most likely due to concurrent Write race)") } if len(z.currentBuffer) == z.blockSize { z.compressCurrent(false) if err := z.checkError(); err != nil { return len(p) - len(q), err } } z.size += length q = q[length:] } return len(p), z.checkError() } // Step 1: compresses buffer to buffer // Step 2: send writer to channel // Step 3: Close result channel to indicate we are done func (z *Writer) compressBlock(p, prevTail []byte, r result, closed bool) { defer func() { close(r.result) z.wg.Done() }() buf := z.dstPool.Get().([]byte) // Corresponding Put in .Write's result writer dest := bytes.NewBuffer(buf[:0]) compressor := z.dictFlatePool.Get().(*flate.Writer) // Put below compressor.ResetDict(dest, prevTail) compressor.Write(p) z.dstPool.Put(p) // Corresponding Get in .Write and .compressCurrent err := compressor.Flush() if err != nil { z.pushError(err) return } if closed { err = compressor.Close() if err != nil { z.pushError(err) return } } z.dictFlatePool.Put(compressor) // Get above if prevTail != nil { z.dstPool.Put(prevTail) // Get in .compressCurrent } // Read back buffer buf = dest.Bytes() r.result <- buf } // Flush flushes any pending compressed data to the underlying writer. // // It is useful mainly in compressed network protocols, to ensure that // a remote reader has enough data to reconstruct a packet. Flush does // not return until the data has been written. If the underlying // writer returns an error, Flush returns that error. // // In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH. func (z *Writer) Flush() error { if err := z.checkError(); err != nil { return err } if z.closed { return nil } if !z.wroteHeader { _, err := z.Write(nil) if err != nil { return err } } // We send current block to compression z.compressCurrent(true) return z.checkError() } // UncompressedSize will return the number of bytes written. // pgzip only, not a function in the official gzip package. func (z *Writer) UncompressedSize() int { return z.size } // Close closes the Writer, flushing any unwritten data to the underlying // io.Writer, but does not close the underlying io.Writer. func (z *Writer) Close() error { if err := z.checkError(); err != nil { return err } if z.closed { return nil } z.closed = true if !z.wroteHeader { z.Write(nil) if err := z.checkError(); err != nil { return err } } z.compressCurrent(true) if err := z.checkError(); err != nil { return err } close(z.results) put4(z.buf[0:4], z.digest.Sum32()) put4(z.buf[4:8], uint32(z.size)) _, err := z.w.Write(z.buf[0:8]) if err != nil { z.pushError(err) return err } return nil } pgzip-1.2.6/gzip_norace_test.go000066400000000000000000000047731431554437500165650ustar00rootroot00000000000000// These tests are skipped when the race detector (-race) is on // +build !race package pgzip import ( "bytes" "io/ioutil" "runtime" "runtime/debug" "testing" ) // Test that the sync.Pools are working properly and we are not leaking buffers // Disabled with -race, because the race detector allocates a lot of memory func TestAllocations(t *testing.T) { w := NewWriter(ioutil.Discard) w.SetConcurrency(100000, 10) data := bytes.Repeat([]byte("TEST"), 41234) // varying block splits // Prime the pool to do initial allocs for i := 0; i < 10; i++ { _, _ = w.Write(data) } _ = w.Flush() allocBytes := allocBytesPerRun(1000, func() { _, _ = w.Write(data) }) t.Logf("Allocated %.0f bytes per Write on average", allocBytes) // Locally it still allocates 660 bytes, which can probably be further reduced, // but it's better than the 175846 bytes before the pool release fix this tests. // TODO: Further reduce allocations if allocBytes > 10240 { t.Errorf("Write allocated too much memory per run (%.0f bytes), Pool used incorrectly?", allocBytes) } } // allocBytesPerRun returns the average total size of allocations during calls to f. // The return value is in bytes. // // To compute the number of allocations, the function will first be run once as // a warm-up. The average total size of allocations over the specified number of // runs will then be measured and returned. // // AllocBytesPerRun sets GOMAXPROCS to 1 during its measurement and will restore // it before returning. // // This function is based on testing.AllocsPerRun, which counts the number of // allocations instead of the total size of them in bytes. func allocBytesPerRun(runs int, f func()) (avg float64) { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) // Disable garbage collector, because it could clear our pools during the run oldGCPercent := debug.SetGCPercent(-1) defer debug.SetGCPercent(oldGCPercent) // Warm up the function f() // Measure the starting statistics var memstats runtime.MemStats runtime.ReadMemStats(&memstats) oldTotal := memstats.TotalAlloc // Run the function the specified number of times for i := 0; i < runs; i++ { f() } // Read the final statistics runtime.ReadMemStats(&memstats) allocs := memstats.TotalAlloc - oldTotal // Average the mallocs over the runs (not counting the warm-up). // We are forced to return a float64 because the API is silly, but do // the division as integers so we can ask if AllocsPerRun()==1 // instead of AllocsPerRun()<2. return float64(allocs / uint64(runs)) } pgzip-1.2.6/gzip_test.go000066400000000000000000000342021431554437500152240ustar00rootroot00000000000000// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package pgzip import ( "bufio" "bytes" "fmt" "io" "io/ioutil" "math/rand" "strconv" "sync" "testing" "time" ) // TestEmpty tests that an empty payload still forms a valid GZIP stream. func TestEmpty(t *testing.T) { buf := new(bytes.Buffer) if err := NewWriter(buf).Close(); err != nil { t.Fatalf("Writer.Close: %v", err) } r, err := NewReader(buf) if err != nil { t.Fatalf("NewReader: %v", err) } b, err := ioutil.ReadAll(r) if err != nil { t.Fatalf("ReadAll: %v", err) } if len(b) != 0 { t.Fatalf("got %d bytes, want 0", len(b)) } if err := r.Close(); err != nil { t.Fatalf("Reader.Close: %v", err) } } // TestRoundTrip tests that gzipping and then gunzipping is the identity // function. func TestRoundTrip(t *testing.T) { buf := new(bytes.Buffer) w := NewWriter(buf) w.Comment = "comment" w.Extra = []byte("extra") w.ModTime = time.Unix(1e8, 0) w.Name = "name" if _, err := w.Write([]byte("payload")); err != nil { t.Fatalf("Write: %v", err) } if err := w.Close(); err != nil { t.Fatalf("Writer.Close: %v", err) } r, err := NewReader(buf) if err != nil { t.Fatalf("NewReader: %v", err) } b, err := ioutil.ReadAll(r) if err != nil { t.Fatalf("ReadAll: %v", err) } if string(b) != "payload" { t.Fatalf("payload is %q, want %q", string(b), "payload") } if r.Comment != "comment" { t.Fatalf("comment is %q, want %q", r.Comment, "comment") } if string(r.Extra) != "extra" { t.Fatalf("extra is %q, want %q", r.Extra, "extra") } if r.ModTime.Unix() != 1e8 { t.Fatalf("mtime is %d, want %d", r.ModTime.Unix(), uint32(1e8)) } if r.Name != "name" { t.Fatalf("name is %q, want %q", r.Name, "name") } if err := r.Close(); err != nil { t.Fatalf("Reader.Close: %v", err) } } // TestLatin1 tests the internal functions for converting to and from Latin-1. func TestLatin1(t *testing.T) { latin1 := []byte{0xc4, 'u', 0xdf, 'e', 'r', 'u', 'n', 'g', 0} utf8 := "Äußerung" z := Reader{r: bufio.NewReader(bytes.NewReader(latin1))} s, err := z.readString() if err != nil { t.Fatalf("readString: %v", err) } if s != utf8 { t.Fatalf("read latin-1: got %q, want %q", s, utf8) } buf := bytes.NewBuffer(make([]byte, 0, len(latin1))) c := Writer{w: buf} if err = c.writeString(utf8); err != nil { t.Fatalf("writeString: %v", err) } s = buf.String() if s != string(latin1) { t.Fatalf("write utf-8: got %q, want %q", s, string(latin1)) } } // TestLatin1RoundTrip tests that metadata that is representable in Latin-1 // survives a round trip. func TestLatin1RoundTrip(t *testing.T) { testCases := []struct { name string ok bool }{ {"", true}, {"ASCII is OK", true}, {"unless it contains a NUL\x00", false}, {"no matter where \x00 occurs", false}, {"\x00\x00\x00", false}, {"Látin-1 also passes (U+00E1)", true}, {"but LĀtin Extended-A (U+0100) does not", false}, {"neither does 日本語", false}, {"invalid UTF-8 also \xffails", false}, {"\x00 as does Látin-1 with NUL", false}, } for _, tc := range testCases { buf := new(bytes.Buffer) w := NewWriter(buf) w.Name = tc.name err := w.Close() if (err == nil) != tc.ok { t.Errorf("Writer.Close: name = %q, err = %v", tc.name, err) continue } if !tc.ok { continue } r, err := NewReader(buf) if err != nil { t.Errorf("NewReader: %v", err) continue } _, err = ioutil.ReadAll(r) if err != nil { t.Errorf("ReadAll: %v", err) continue } if r.Name != tc.name { t.Errorf("name is %q, want %q", r.Name, tc.name) continue } if err := r.Close(); err != nil { t.Errorf("Reader.Close: %v", err) continue } } } func TestWriterFlush(t *testing.T) { buf := new(bytes.Buffer) w := NewWriter(buf) w.Comment = "comment" w.Extra = []byte("extra") w.ModTime = time.Unix(1e8, 0) w.Name = "name" n0 := buf.Len() if n0 != 0 { t.Fatalf("buffer size = %d before writes; want 0", n0) } if err := w.Flush(); err != nil { t.Fatal(err) } n1 := buf.Len() if n1 == 0 { t.Fatal("no data after first flush") } w.Write([]byte("x")) n2 := buf.Len() if n1 != n2 { t.Fatalf("after writing a single byte, size changed from %d to %d; want no change", n1, n2) } if err := w.Flush(); err != nil { t.Fatal(err) } n3 := buf.Len() if n2 == n3 { t.Fatal("Flush didn't flush any data") } } // Multiple gzip files concatenated form a valid gzip file. func TestConcat(t *testing.T) { var buf bytes.Buffer w := NewWriter(&buf) w.Write([]byte("hello ")) w.Close() w = NewWriter(&buf) w.Write([]byte("world\n")) w.Close() r, err := NewReader(&buf) data, err := ioutil.ReadAll(r) if string(data) != "hello world\n" || err != nil { t.Fatalf("ReadAll = %q, %v, want %q, nil", data, err, "hello world") } } func TestWriterReset(t *testing.T) { buf := new(bytes.Buffer) buf2 := new(bytes.Buffer) z := NewWriter(buf) msg := []byte("hello world") z.Write(msg) z.Close() z.Reset(buf2) z.Write(msg) z.Close() if buf.String() != buf2.String() { t.Errorf("buf2 %q != original buf of %q", buf2.String(), buf.String()) } } var testbuf []byte func testFile(i int, t *testing.T) { dat, _ := ioutil.ReadFile("testdata/test.json") dl := len(dat) if len(testbuf) != i*dl { // Make results predictable testbuf = make([]byte, i*dl) for j := 0; j < i; j++ { copy(testbuf[j*dl:j*dl+dl], dat) } } br := bytes.NewBuffer(testbuf) var buf bytes.Buffer w, _ := NewWriterLevel(&buf, 6) io.Copy(w, br) w.Close() r, err := NewReader(&buf) if err != nil { t.Fatal(err.Error()) } decoded, err := ioutil.ReadAll(r) if err != nil { t.Fatal(err.Error()) } if !bytes.Equal(testbuf, decoded) { t.Errorf("decoded content does not match.") } } func TestFile1(t *testing.T) { testFile(1, t) } func TestFile10(t *testing.T) { testFile(10, t) } func TestFile50(t *testing.T) { if testing.Short() { t.Skip("skipping during short test") } testFile(50, t) } func TestFile200(t *testing.T) { if testing.Short() { t.Skip("skipping during short test") } testFile(200, t) } func testBigGzip(i int, t *testing.T) { if len(testbuf) != i { // Make results predictable rand.Seed(1337) testbuf = make([]byte, i) for idx := range testbuf { testbuf[idx] = byte(65 + rand.Intn(32)) } } br := bytes.NewBuffer(testbuf) var buf bytes.Buffer w, _ := NewWriterLevel(&buf, 6) io.Copy(w, br) // Test UncompressedSize() if len(testbuf) != w.UncompressedSize() { t.Errorf("uncompressed size does not match. buffer:%d, UncompressedSize():%d", len(testbuf), w.UncompressedSize()) } err := w.Close() if err != nil { t.Fatal(err.Error()) } // Close should not affect the number if len(testbuf) != w.UncompressedSize() { t.Errorf("uncompressed size does not match. buffer:%d, UncompressedSize():%d", len(testbuf), w.UncompressedSize()) } r, err := NewReader(&buf) if err != nil { t.Fatal(err.Error()) } decoded, err := ioutil.ReadAll(r) if err != nil { t.Fatal(err.Error()) } if !bytes.Equal(testbuf, decoded) { t.Errorf("decoded content does not match.") } } func TestGzip1K(t *testing.T) { testBigGzip(1000, t) } func TestGzip100K(t *testing.T) { testBigGzip(100000, t) } func TestGzip1M(t *testing.T) { if testing.Short() { t.Skip("skipping during short test") } testBigGzip(1000000, t) } func TestGzip10M(t *testing.T) { if testing.Short() { t.Skip("skipping during short test") } testBigGzip(10000000, t) } // Test if two runs produce identical results. func TestDeterministicLM2(t *testing.T) { testDeterm(-2, t) } func TestDeterministicL0(t *testing.T) { testDeterm(0, t) } func TestDeterministicL1(t *testing.T) { testDeterm(1, t) } func TestDeterministicL2(t *testing.T) { testDeterm(2, t) } func TestDeterministicL3(t *testing.T) { testDeterm(3, t) } func TestDeterministicL4(t *testing.T) { testDeterm(4, t) } func TestDeterministicL5(t *testing.T) { testDeterm(5, t) } func TestDeterministicL6(t *testing.T) { testDeterm(6, t) } func TestDeterministicL7(t *testing.T) { testDeterm(7, t) } func TestDeterministicL8(t *testing.T) { testDeterm(8, t) } func TestDeterministicL9(t *testing.T) { testDeterm(9, t) } func testDeterm(i int, t *testing.T) { var length = defaultBlockSize*defaultBlocks + 500 if testing.Short() { length = defaultBlockSize*2 + 500 } rand.Seed(1337) t1 := make([]byte, length) for idx := range t1 { t1[idx] = byte(65 + rand.Intn(8)) } br := bytes.NewBuffer(t1) var b1 bytes.Buffer w, err := NewWriterLevel(&b1, i) if err != nil { t.Fatal(err) } // Use a very small prime sized buffer. cbuf := make([]byte, 787) _, err = copyBuffer(w, br, cbuf) if err != nil { t.Fatal(err) } w.Flush() w.Close() rand.Seed(1337) t2 := make([]byte, length) for idx := range t2 { t2[idx] = byte(65 + rand.Intn(8)) } br2 := bytes.NewBuffer(t2) var b2 bytes.Buffer w2, err := NewWriterLevel(&b2, i) if err != nil { t.Fatal(err) } // We choose a different buffer size, // bigger than a maximum block, and also a prime. cbuf = make([]byte, 81761) _, err = copyBuffer(w2, br2, cbuf) if err != nil { t.Fatal(err) } w2.Flush() w2.Close() b1b := b1.Bytes() b2b := b2.Bytes() if bytes.Compare(b1b, b2b) != 0 { t.Fatalf("Level %d did not produce deterministric result, len(a) = %d, len(b) = %d", i, len(b1b), len(b2b)) } } func BenchmarkGzipL1(b *testing.B) { benchmarkGzipN(b, 1) } func BenchmarkGzipL2(b *testing.B) { benchmarkGzipN(b, 2) } func BenchmarkGzipL3(b *testing.B) { benchmarkGzipN(b, 3) } func BenchmarkGzipL4(b *testing.B) { benchmarkGzipN(b, 4) } func BenchmarkGzipL5(b *testing.B) { benchmarkGzipN(b, 5) } func BenchmarkGzipL6(b *testing.B) { benchmarkGzipN(b, 6) } func BenchmarkGzipL7(b *testing.B) { benchmarkGzipN(b, 7) } func BenchmarkGzipL8(b *testing.B) { benchmarkGzipN(b, 8) } func BenchmarkGzipL9(b *testing.B) { benchmarkGzipN(b, 9) } func benchmarkGzipN(b *testing.B, level int) { dat, _ := ioutil.ReadFile("testdata/test.json") dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) dat = append(dat, dat...) b.SetBytes(int64(len(dat))) b.ResetTimer() for n := 0; n < b.N; n++ { w, _ := NewWriterLevel(ioutil.Discard, level) w.Write(dat) w.Flush() w.Close() } } type errorWriter struct { mu sync.RWMutex returnError bool } func (e *errorWriter) ErrorNow() { e.mu.Lock() e.returnError = true e.mu.Unlock() } func (e *errorWriter) Reset() { e.mu.Lock() e.returnError = false e.mu.Unlock() } func (e *errorWriter) Write(b []byte) (int, error) { e.mu.RLock() defer e.mu.RUnlock() if e.returnError { return 0, fmt.Errorf("Intentional Error") } return len(b), nil } // TestErrors tests that errors are returned and that // error state is maintained and reset by Reset. func TestErrors(t *testing.T) { ew := &errorWriter{} w := NewWriter(ew) dat, _ := ioutil.ReadFile("testdata/test.json") n := 0 ew.ErrorNow() for { _, err := w.Write(dat) if err != nil { break } if n > 1000 { t.Fatal("did not get error before 1000 iterations") } n++ } if err := w.Close(); err == nil { t.Fatal("Writer.Close: Should have returned error") } ew.Reset() w.Reset(ew) _, err := w.Write(dat) if err != nil { t.Fatal("Writer after Reset, unexpected error:", err) } ew.ErrorNow() if err = w.Flush(); err == nil { t.Fatal("Writer.Flush: Should have returned error") } if err = w.Close(); err == nil { t.Fatal("Writer.Close: Should have returned error") } // Test Sync only w.Reset(ew) if err = w.Flush(); err == nil { t.Fatal("Writer.Flush: Should have returned error") } if err = w.Close(); err == nil { t.Fatal("Writer.Close: Should have returned error") } // Test Close only w.Reset(ew) if err = w.Close(); err == nil { t.Fatal("Writer.Close: Should have returned error") } } // A writer that fails after N bytes. type errorWriter2 struct { N int } func (e *errorWriter2) Write(b []byte) (int, error) { e.N -= len(b) if e.N <= 0 { return 0, io.ErrClosedPipe } return len(b), nil } // Test if errors from the underlying writer is passed upwards. func TestWriteError(t *testing.T) { n := defaultBlockSize + 1024 if !testing.Short() { n *= 4 } // Make it incompressible... in := make([]byte, n+1<<10) io.ReadFull(rand.New(rand.NewSource(0xabad1dea)), in) // We create our own buffer to control number of writes. copyBuf := make([]byte, 128) for l := 0; l < 10; l++ { t.Run("level-"+strconv.Itoa(l), func(t *testing.T) { for fail := 1; fail < n; fail *= 10 { // Fail after 'fail' writes ew := &errorWriter2{N: fail} w, err := NewWriterLevel(ew, l) if err != nil { t.Fatalf("NewWriter: level %d: %v", l, err) } // Set concurrency low enough that errors should propagate. w.SetConcurrency(128<<10, 4) _, err = copyBuffer(w, bytes.NewBuffer(in), copyBuf) if err == nil { t.Errorf("Level %d: Expected an error, writer was %#v", l, ew) } n2, err := w.Write([]byte{1, 2, 2, 3, 4, 5}) if n2 != 0 { t.Error("Level", l, "Expected 0 length write, got", n2) } if err == nil { t.Error("Level", l, "Expected an error") } err = w.Flush() if err == nil { t.Error("Level", l, "Expected an error on flush") } err = w.Close() if err == nil { t.Error("Level", l, "Expected an error on close") } w.Reset(ioutil.Discard) n2, err = w.Write([]byte{1, 2, 3, 4, 5, 6}) if err != nil { t.Error("Level", l, "Got unexpected error after reset:", err) } if n2 == 0 { t.Error("Level", l, "Got 0 length write, expected > 0") } if testing.Short() { return } } }) } } // copyBuffer is a copy of io.CopyBuffer, since we want to support older go versions. // This is modified to never use io.WriterTo or io.ReaderFrom interfaces. func copyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error) { if buf == nil { buf = make([]byte, 32*1024) } for { nr, er := src.Read(buf) if nr > 0 { nw, ew := dst.Write(buf[0:nr]) if nw > 0 { written += int64(nw) } if ew != nil { err = ew break } if nr != nw { err = io.ErrShortWrite break } } if er == io.EOF { break } if er != nil { err = er break } } return written, err } pgzip-1.2.6/gzip_unreliable_test.go000066400000000000000000000027631431554437500174350ustar00rootroot00000000000000// These tests are unreliable or only pass under certain conditions. // To run: go test -v -count=1 -cpu=1,2,4,8,16 -tags=unreliable // +build unreliable,!race package pgzip import ( "bytes" "sync" "testing" "time" ) type SlowDiscard time.Duration func (delay SlowDiscard) Write(p []byte) (int, error) { time.Sleep(time.Duration(delay)) return len(p), nil } // Test that the panics catch unsafe concurrent writing (a panic is better than data corruption) // This test is UNRELIABLE and slow. The more concurrency (GOMAXPROCS), the more likely // a race condition will be hit. If GOMAXPROCS=1, the condition is never hit. func TestConcurrentRacePanic(t *testing.T) { w := NewWriter(SlowDiscard(2 * time.Millisecond)) w.SetConcurrency(1000, 1) data := bytes.Repeat([]byte("T"), 100000) // varying block splits const n = 1000 recovered := make(chan string, n) var wg sync.WaitGroup start := make(chan struct{}) for i := 0; i < n; i++ { wg.Add(1) go func() { defer wg.Done() defer func() { s, ok := recover().(string) if ok { recovered <- s t.Logf("Recovered from panic: %s", s) } }() // INCORRECT CONCURRENT USAGE! <-start _, _ = w.Write(data) }() } close(start) // give the start signal timer := time.NewTimer(10 * time.Second) defer timer.Stop() hasPanic := false select { case <-recovered: // OK, expected hasPanic = true case <-timer.C: t.Error("Timout") } wg.Wait() if !hasPanic { t.Error("Expected a panic, but none happened") } } pgzip-1.2.6/testdata/000077500000000000000000000000001431554437500144755ustar00rootroot00000000000000pgzip-1.2.6/testdata/bigempty.gz000066400000000000000000003000031431554437500166530ustar00rootroot00000000000000n, A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ ;p z 8o=b[r}؁Aփ\_@ A/ v@@ P;p z MUB!pgzip-1.2.6/testdata/issue6550.gz000066400000000000000000002000001431554437500164770ustar00rootroot00000000000000@Q2PW^|>ÄuN, 0%ts _^U6lQM5V/P~PL%ձ)8#~|)U'PcyRUZ֨k$G:a.nO\JfQǕb}opsuj|E+qLGt=R/S2:*KUzvjjջRUt$b>FF:.bM[d+]Blqgس^;@TjNUB6QqDNbv5ȩYb{WTvHzriԜ rM6 \]<,Q8d毭p v%NL`130"nHQ>YV+[9׶jZͮI;b] wbKX}fȯ>]^Z""ceF/`K~\Up^(i 5%|ڜ0}hR(?^1IMɝle\9\8VֱM\m4/  t$6K=K3u;VEi'ߖ>^DKjkj%2s+&gz\2ZdjN&uݻ)JI\JA*[_nUŻ{bb8Z7obIBp_Ǜ| Dd|~TsQS =pzyX5j0B 1T!K<O瘰&J^:?8>tp75-&L\r*l)f+f^wo8QY)HGq7lۻC^f=I l5^UC}:F5M ܍|1/粹\+Z._5j65LnK;Sv?ؖAN\Sti&@uw$ CP$PAhϢ\NFD"!Az~^ |֌cc+Ydܲ<\Z9\ƩKmejLnwz;e΃1'J^0HЈci`70wxqomBmo4? n 'ٌ mNBL77O6rl\>ոFRI-]k#N%6ѫB!k r|7IGwX˒fyqI0F"= _w=3|}FSZ^)lab-I>sa8Ʉ#fbb{ƇAW߻+ 7meSB"BcX'/m 0PTT=0}qw;_hI 맷&cA*Ţq\-2b![y^NXOrIHx?g;HU;ak_ ce$]SO^9/aС|$]8)0mj -KF92T9ptpsNײN2Rfv38Tc,t&ߛ⫎chޜM'(D^<_C4xL&2xDZ,`>@^o/Lj(EA($Raub51ѱqxT7%^)^7:)F.vm ֣odORQZdzvIM'h'IC'~?aQ/n\Ɖ`zjPBCTS $iVUWGvH]]!qGFw L Z1܂`0@LWwuUJ`+a! Ӳ-H´2yGQYٵYYGGtއmMV/>}c{Vvm=# a8kr:P+|1Øt5۞KԵWjJ]{/?{Z—UԗߵN巿^?_{?xE6؋@|l܋foauJư}W*([SvW8g~r8"yO ja=  ?8_H# s/X|v>uZSwly}YQ*)y@@&|r(@1>|1zӼljz-jc9d4p:(<{/em>}MmDHE8WФ;{x߅0=^%^U F~~4 DO?δ2Tu6 lj8L8>,橞fx\N?z-l%q5T&q p\/?-$q8ƑIg%M{{M"(9gӡ1w,KSJJ axʥ$#$OK|v "$-|x^8~xnoz. #|:j8 `*"]Yܲũ2|+6졞z|@!GA [ato:FAHp4$EpiIG8,r\(pǕG=I\gBX?XG>٤n7Fӟē*A_\xJ0?Jx%js}П=&l|{A@;>?"|HeDp896-,=\^Y̟2GٛY+k&t@,hPMxo|mu%*zp+O@U&a i@J];8+*PDUg;ԓWz ջolv&A->zQ~z6[g[ϷN^|Z}I Nߺ^;F^_^۝f׎?BӨ6ҍ%S8 H?woi7Yԛ<8/e0@MŔ^\ n9 wPz=\OS;{9`ӄCk;9A2,HMRS͡p#n (eLw-X\5'Ё|K9r.?mW#@k!+뢡;o#j:j|"ThAuJBTd2O+$@ JGVH3+#&JmCՋ#| &R+_ ՔhFc9dc<DDW~ŧH_Nȩ޸|n0+ )+n=w+Tj:(5dIA'LJXH ~7,as7U!+d) rw'z G#:~b(x\5шSnuhyY*ks4+$s:N&qe M0VaH d@B=k:ȵ 됑'a'*]~"ϣ;Q#%R׵(/h#$SCj+],!|#tXvhzPjB(j4 A4'l->Lr|`/V~=m|&)K52iz2j-4lO xs<$BnzEG.C O5)LzQl Dj(5-pNʐpR9}F:3oH8X';AN{Vtt91e8 C6 $tI' YNJӱK@Lz~8 K6zۏdPhatkޑyŢ1Ƅ-㸀{ aYp-y`^;waR7$5jCφCc y1#cHrQ92.6|Cn ]zKDQ dkdHv-PZ8IIZDirǕMԍMPKjSy0]Y>u z>+r:RF8%@KyPvʔH&K%(Jw%GǾ|u3}xQZ7Rl8d8CNOBO\@ i|j}"E aZsCRbP)Pۓ~%ϒ&s sթ+./. &EX T,P2soٻyHd{'ųsջ$P*Ǯ[e]T. A!znC]ԣl h _i` -PaRA<0~Oݒn:b; K8nPȫ޳:tg `Pu9VŜn} kِWؔKBَԕ`tP&X[ Ay:d^VxeG9@e=O9(ZK9|rK9ޫNXl﮺VJXBz,9*MS"5̣aFXeOz{$– "͔e#^GI6^Gj:^8K@Nc2)N_*U´UE9ܧB./tPWS^m?T6[$!0Ah}|V:좡!Vœ4޼ ,q7}_ı{5e TUU &Fuv#sx3wrqAݼR҃*fj_%M=S@ ߩ:'\?4ˣ-7?<j:Ȱбc %:VxT-%.\RٹgG Q0o$3 D6C=-*xp$(g>Q\uQۚ_-Uoo**r7Wfթcxe^=d x;ʯ8d|!'^.My"7fK&ݨ+d @qF>MZ(eoXd(k-6w%8"og?C[\d(ŗ*h2#}fȑ6v·Tv@ Jvhe["^lϛ9dAƀ>sc-([  x}T'Y_-Uk7]؀Q,Iy.s50]HDKGA]zK/Nb4L#sI*D#Z0tR<*204tI6)'iNظltI%8 췿|b_X֙dvbi@bIEP\S z}iI/F/-Mbcuu`3enhono偕ԳYe86dE`G$V-F*%etLl<5l6++:%OLIDZ1yb{B#%eݻ/-+ fjt⾞5;( 9@ gy؃!^Vg/Vݾu2}}!~Pu.bvf5z|p`ԋLYT*La;9!Sذ}vDK/ޯ,㥇 d̛˯wzzoiouƨS{`?_9n3Ьv ]$}>~} B9l7`)*I;MgYTX)\AM! _J'rޫO~qpVBzTFݯ-BZc1|u`_HR\S}sZcJ$fbI cUJ;/Vҁf1wY>㐉0Ox_7(VKуMGǯLu=&J #Da's8s!)tSȁ\FAQcl2匓\1Tp<*ttL9)\ c- (-zoX TT2Bg@;%J&{Fsjbglf }yfmu@9iJC0F!)$W&K^J%r\ֳIy$[ZWnl#؃D\&E`:i1~x:8/>=Ũ8͚ܯ&Sœ]cUOSw낻ze%pF1уMވ7O&3ۄ Ƴ>epXKXN9#ݿY{Kj?`3Al0F,N(&/yW?) ByUlcxjĕ/}i|4)犺iLf"6sbRȎ+,P2 e:i~+w$ קl#f%1J'=pt.IH} Y>dO&YW+,!lL~Annm b`V t %.a^}rR/mszɆ d^d!:5tt_uh EGX \Mܗ^<G˦.1|./O':R$+ig`~%S|q)l@c9nސԤp6g^YR`Pa)\, 㳠Us{d]huka#kP9RŘ+0Q<:%q#'I]3%oaDl\h5CˎBB@.aX^ӵwT,<N[ەY cTԈ =Lp K IN+'S^K/MC&A[^\Fp#lF(Z> 񎴰1 4ir7|[yc % 2I՞UKnHL $$u90bϳ4L]1v;Owj-+2/HgL+vF׮)2 &2sl8Jw=i1#2&Tsp;lƊߟBwG0U9ā;PУB!s3/S͕a3pQĸk\i_y^arA-hA}g$0Tc0`O&C zN$ҵƬ8".f HDМV"OS]6k[J<ٓ[<iq ٬`g[ang-e.[Ɨr5{z6-Y*Rv= #Yrٕ.U]R+Օ/S惸a/O+G~5P,M 6TxbXc]?e~tX5;a};ӽIymu:#ҷߚz?VAdJ Aƒ R&ϱç,rGB 8̥dfͫxe!FTNC aD@}F}/iM '_[AD$`|AQK{ZEٗR+Qk1)d*lV0V_ŎtL JJ'1À2GX^ {Tp}xe扭{ps%L>3޾<8C6tu- \1bTYhU j<ȞdQ6wtYG.+q$wtJL{zm+x؝U۷w*2ztd"c̯IzÖTP Rf͊W{z:k%+qj_xm\0|VPLd`Z9vY xbߗ.)B$kҍFXo$U*KS6Z _-I13m4]r@/e{@OL?ùxN0>ʸů=Es 9mb7VA9G{my'e]\iZ8*uiBa8K<^<pt;h{&kQv-Xy#'ݰGb-:弾^-N($07#(D +V܄Iwu8X~x 1KT:N$0A_l}G+8q%B˧0Ną}ms(}=10k^kӂg%r@hHJb=sO-)RaJkѫ?cGm&}.xEvms~a0sG}bq(PN}SN x'E v:h/*nN &>5# $޳LRjR`8#AP:F,1k6q -e.4mjxvo՗nШ7,qTe-u|EP:$t|.hcr8M!LwEǦńe,::%ѥWgd[;xIh|t+k^l:PCa S]'W9y&7k'QwN|}~m&ɟ,I @*ʘ (Oj~/Q".Xyl?['OkO^ԐrhCLcQvyZL=ͣF`NVqc%[/ҿ},u"AfΆLGU H\5(x9օ7vcGE^~2{K)SS&VfV}N®3O0&x.lbSJhNnp#'f"tq38^?v,@ifkHD|,~r&UzЭގHZV` Yg =A0c+I&5-r#%p r}d鱹G6{?p;GuqaQ]_ (eu0ޱnc#cNXX'ЮrtYLj9+S05&EQ TS4Uu(]U\h>Yb3\&dxa )>Ѐ@sMS*2x.Yt;S&.|u4fAv_n㷨c[R 鷛[VG}勐)2? ԋ$3v!;Y-[j]A.^K)5i.HҲ&EN|A!@p @/sn&; qi.|]D)ۈWDV$WtK47yMRΎEFy$xqr9sg*iwcbǡ,MJ ňdXc=Þj(in18bu'ΞXsXxW7~ab|Kެ5c YHD`" ;{| g( 8c9j[3XԯYnvŵjV)i&e\<4m^. oW*2OgW]u !HP }3/];\1~bHfzZζ /S\舐Ħ+,5D5mTiT2jES ܰJ,Ty|XC+4jk76-/abY4I Sr0Ik:vfKa;5Yjxpp)hyF 8Cci9_[ }maީ/O+ҧ6&?)8ko]X^cU9@Ew28h#5Ƿq D)\pfיּi'S>| 7IY̹0tډg}j m4d:hP/},uezZmxO:oĂHaͅozod[gN0EyEZCm/{U{'e892r;)ؕ}8`IO5&sMp9ʁhm4*lR{Br4 b„<21YuDB9 h,Om9c 0D#9U%[d 8/@"ZQb_٧.ޣIIo>c#[\hɶv]_YUHIN'ps¾Ns7 q4Os"vvuڝ'VX2.$-+Ƥ: ZYi0.ޑNթ ζRQi([Gb+-BA(p. L M0O޵s*\}+('ׂzC[x/gUQnh _ 5Ql4S_s v_蓗%⬐|K5APIR;S2J, j}7W=lm%WTVm? %74i&p (s[`3Tؾ-_xFaQ^mMLJ~~IJV5+_8oGKҵ=HC/zVQ&Vڹ %{[ pdY/8XVlW-fkrѪhdRQ@xsLuQErzD7bxuNpa)'wW9ZdΖ k=id8& G7ʄkȩgrR_ 3/!= ytQJc -2Va8&D'r[2q!5Iq<|2\D ijk&S&𻱅ϕhJ@"DOV-lʚ,3BN(`LQ$47(5zz_HJӧӱ꘶ySy [tuej0<N[pZc2 v}aB8uSESGLG>FbNbD[Nޟ_цTpRO#4>Qdx`eEh/9XоıSc%xc3o_KvشF6hb`` %v+Kf^œ;#yT! sH o{\cֆRV2>sVpUqA&xU$I84c:kC]h_Q$0ٍ. _@ݕ+*S5zN}qywu2 MH9OUI镨LFܴ^ S%\w$ȡ]ߕUSmdu)=)2 p}?/.H٣I>7_}젱5h]4KjBtӇ jhNp6ES6<4 >c8y2]ZPt뫁=Pyݸ(BD;Oj>T>"#aۍקˋ(+Mrx^wEdCxLʶN;jet|3k҉;K3CڽdVtf]C+&߽$+w1$&1]a"9&9ZZY ,,5.|X(IKs?r~ +5nNzaA[wH>t'~j䬃{t][P@>v^db-eqmsgxSz^cYqN==Bc!KIL0cDHa84T9eR O\ +^@P*}ԾBkkf4_.Wbp?fYsҖWN:\2^JyHđT8/83If1ڍ-.U2r3mQt-VPr/xV E;[/4fl[< >غiGy݁57PM@C;d48.\X4j=!.E귞kV\zݮz^kutv\RO\^uŖ'5w.Ylt?A羴% %p̯ . ,<[`|Vۮwvxւ7=%U:͞ WT7%'{6[͸y;A pόo.1r=J*eeFytIHކ\.񇡮م@#OJ+W6typTOW/L7&zwS)A|~F썑)G44jdj PfٴOW]0&G3[{NGOƀЅb@ mvs(uv2̆Z˚Y!<%HPRIlt67]N"K%S,jCavKpL|qqחĺE(WeG{η%K}^^4{RU|K*K8-e-1w,%>>Z5I>)úndk{Ӎ _F'Y[pT88Dl2-|t ,͹uEhw%D;N][L@?yu6l$>-w>żyٝ,?|aJҵt0c}Jj2 ru_Ebs$qpH=r$\^{f Z|pbknhD)r4OAuNyμ&Jd)BD÷,q;klwZh_17b uM&/]2,hv.O '.oܭ1+^Z^K2?ޝ0mzkɇr8E)T3A*\xRE o}yb=NƢo;a2F($Ѳ^WC^ b2`cW8[Y{Cצ*. " @*A4 .DyFa# E1*q,ûp*Ʊ9{^;gE0Σ Ɠq"K@Pheh䆰,F)M2F ef^jXt=tQǶXxqbBi6. дF$5qjVo.nAdTabxPxFV?\U@n8p~%CaR52fGq$Sdl8%uY紒k,;5ƽ-KoԨ%aYcwwdOD]N5dO(U *5**v0%)h5psk ęB0I3(b}\! 32GW0{>qMvuk5qp5`ѵ!iqf;o`hk`:}xq{XG[@QeFz> u֬mf]}`'&E8EsĤ@*8 GC,^DtR 4g~tJEϢQp%;l2JUyd!C4k!1c8&Na'4\׋S7)֛:۽N"⼾;-8tcӣ)[ Mkom d/%ru9},y[1o1` c5#t:sG|863'7U0Ysn$Y77g\z_il-ʆ7-[l%1nLV{Pp)B}ʖ~*-?=JsFzQ*-Jy8 `BEөzJ }0OɘNh<_]pS ®$ZǛ8ƯT%x:FpPd@hĚ@"/=<{]xmXcG"Doyhjyqp^&W优,HrV&_*`op*kͻ#оo^оk?fM?&-c#Bc&!1 ?ƚGǥ'9AWB\(UJ >#O-j/KUЦpD&FhU>xϑAE@kyzjV^U4uGD󢁳hrYjxÑ8AR S (Cʝx3~J꣏ҷi"RCJH"˧P "IgU$ C;:Zazbo}"On3ˉIKeu<x|g6%!7k@?8 0J51ZѲKr﹒e4K,+kh`Ĕ/o'[Dި9 M,$ա1t O9S\3X \C/UͰ~WK^E耏\m[mR'i0v[D|/\*/PʨxJty_Ɲ}pVr9~՛LPFibPSckŃ|5,륂FE;S:<,742zsKՈ/K%H ; R9Ζ etuFq1NWωsȒ CZ6 ;7S6$Oܷe98J?yݱsw|STyrzKfq͚_zߒKb"&Ƥ?wm3N8 S#$hjh:4m@g*+Jp >90{g(MX3#o&LFZOYC#'–ʓ$+p 킫\f4jSalP29K֧￙*IZ٫5W5Y\:(6FRz,a-Cmx'<%WaqVM~\_;;|R(_>[1yB˵=`Xvo8d8&l†BwOIykPy<k|Pt&~* ݷ\na\P]v1tMp5μ(K$^xƲ fUw%;国Vo-/kDn$|5gK oI{d  0uӿ Hc[5#XjE)F8ٝ gtڛw%J^ #g

fˌe<60c>7fќy#ZޫzU{ϹgN~UK;Og/h6ۍ^Uo;u0&ٜ .<}7p]]gkh0uEg݈bGBAo_w沸OE@=INZ1m(BԢYeۮ^ œ|bvI˕L-Z.A4L^ɛ~_^ʤz'XQɔG#e1.|}+~dP8Pp»}w ė^9:^hj鐫D+jB0,Ĵzclѹ( ix/<n1Չ6|_g~}HUo$ZPq| >=/$xB;I|O"z<[I=T|T>k𧚪(+"ExwTm׼V|v P.<{4%fߙB`2vj0eԧu /[Ѳfzq&=@r 1 y|N@onZX7XH"x+lI|V ѐ;c %sJ+[iI, UBѻmWOw>#QET)(Ӓ>tJ%{xPr!cFstsJ.%#YV}D Uǧ#O%htmuэQ7L0 ITŔU=Av#lf1u :l1 Ґ՗ُQ{zw狗vvގ.~!`F QϦPA݊Z-L>/0!ߜ{F~OKVog|Q8CXeQ nP+|S ת 445iĺ܉J$!YN(Ԇ4FTZ ]ບɨKx0_Z8%UC&<XQ4Uuָ2T&.ՔJM֍K8nGbSrBc)2a:dxTف؄7;FKcI/?;ұHf2 0H犏&dTpzt!Zɀ@HY jPߞhI_=՛-%'SEZmpFcϿx>+.zJcLp|u:3ٞi[OI*xH?->ϾcyzV_g-Hf4kZpՑP@SPp"| \6h_<&e;~ٛ D@@ <r@,iZێensV]H;3e/)Dݠj{%?])TZ&O,mZy[CI!.?c;Ik56Y5^H]*'7(_óHJ;n Ț8HA@1b{c9ت$ہS"XdT+3]Lw<|Bw1aۚ_W@kf8ekͳYy6o7sW c8w}Q]WxF;-a v~_gQ⫮lD\*˗yj x y@S@r_o\kݵ qI4)vfݝH% 4 tb]b9QY2tl+^H%1:Lw!eR pGud< MWB*{ʡZ?<8d7(bZ=mLl]S+ኤ# 1 A(x" 1X.ULb8Abu=rZNUzqpbcg?UjۋK,bajW AˤiIͩ}_Q֜FDk_kGKVd^*6u}#:.1+tVD&I| n}dx³u~i6g%iH<fETm(o նI|SٺƵ%xy`!:ŒSWIv+9be2 ^,動]͹k8J֬.DH|r%gnn9[V|_Hq$jDIm<2H=K/mrx]+:_ꝩ DpZCkdp6h>uĈcl3|j}RQo DBj -_f+v8:z3Rez󬵞='Z޾(ixT:nYu aÎ*8B'H`ݬI㔹@@aX%x6ّK} 8iʈß8@ #> 7Nl3gua]ɱz'3VoKų JB &D6rn%~i@Yk?Z%GT'sfhzX{c)ܠ'JzLng SdaRj{#XcXM6 s GkB9WO/<[Ͼwyz !zWÅ@!2%~c9FB@(>Vpy.u~fTг<3 hBy7vf696BNP4)~+6O6xۤN2q΁/ :^b+`P.G_>,NV8_OG"iN 2-oimfQ5$Lj+on/ˏ'{<ސI(*`& i-j%U)29R2򴠀XֵˡMz.W%zԲ>D4:BQԋ!G:{2aX"}jj,_oIQfѩA5Ƞ)m;LJʄ@Pf5fނꞳat}Xu8bbbsQx0E;,KvbڴL=ճ#Y-;PVmn;]zܑPr;xiKH,MDUZ$sÌոwd;/$J^`Oz7uǖЬ*x"IDI*lF:. AeI\x1i|yx#ߺm׽u}ݷ|kyu| ;-%57۽V9S4av+@Y㺞-=rXK cv:ӝM%]RÒʔ2H3D0,bızF1II'y%4^h?xY8VMD O_o||SE6]HjGvvgrENƕ5[#>=Lo'gݹ-¿b,՞*9s}oz<43u`%"MLJe-KSEQVYĴ<Dƫ6`!"Kit//;x4XH(#G2Y+GM_'iSq14Yn3Qv gpAT 2W XI}Nk._Э AMWhYۨsZF0aZ ʙjny,+rnQAsvWi=$۫w:a/)22gR\_fF#G)mb3r|ƴ0qboI|58LW,ޝrn(PEi8P` #hg3h:6(#y|~6k98jYڵH]26L Ef r9[:$RVKC3gR(3IFB,&V{O`3U_1TOeUGCD < ixfsYpK@1e-9,SjYbӿnT`z_Q9` p k!qB1 f@{%CҼ; b0S/KIP3RV7wu{q0d[b4l7X _|K寚,~('?άP(bD G9EWLhM,h73ٺ`gI%9?,++ VK?Zw08v.C!# ԫ r V` B1޳s&7aįĐ&dߑq 1PFZmZNyN=l a8324ғ.0`l qBwc)Q$#ɨF4H+f+='A xՅvOQcȣMM!tkw;yQ ֔h(/>9LUyRj#}P )(6"e/+^>Ӈ~F'rxpl!vj6OZ'9}øA)8Pkp-0 ΆWzm4zϋgW0ܷc!!2a5|ɉJ)^rxh]9 >Lo[fV umǩh$#JMo8fpgQѝK'c[ iVdLN^ݘ]h$ I-mNxDbiv4cEԜ 'ؖF/l6NӘhÓN[^fomi(HzJt1y$L,cɤtPfjǨᔀj\=tI|OK mxxυF;u9mbh Fw5'ݙ$SB  ./fs®3YeOu巶S[ W :MPAPse P+:wK8|>=}H&S,wC$.xI}x}[@#4 ˗>4^Q+4*ĪTrvFXSeä{6Tua}H{~{M.5gtH`L5N1=[*lfY= C\ˡU,+u ^;i':(I>?itA[[%H;)^Z晽^A?(N +/`PSAPKU|FxV98?n5/mo@:]_'s>i.mV?%wMW'oƩЯN=-ItKuiZ߁a/Px@4sXK{{*";1MD4iMZ8 ID|ZUlPŹ7De7=^'J5v#1Lk2śf?gN2Ʈ^Rl)fm-`,O' q@mj5擛`̵ tj<*aö>,X oH]dk7'z{^i"2ƌΡ*OVupǽ7]j"]ٷJg!>jd4UK] U.|W3"^=it'օzb -׏%+#HFؐQ *؁:NypVqn#;w1eͻ6h;rQp33B!5U+qWv!vt5Jn8̮P{g;5z3tsyGRȟN۩8XLi,`!܇%xpT`u]x6ǧ~~ee,2& Mp*2p!tjV \Q漊C/x9 Cƅ,/.`, RlVAKm)6& %aS^zs!cdqQO lz MjʔDF [u3x N=tm!OlzJH{?<$at J{.NO«c.".6ة{2=w yL/F&FF$>ێAS{ NBU]%dz)޺&P#|DG ieC5&h'ZDJ8 N]jSbJZas-~ ndzHv}nusAE5miqǭ G+aElqBIghUMSCH4#q)RDp}#y+U~ H}7ݠ ^@~T1W is$*j8+"!Cl_^8-Հݿ"DΖO>VyO7Ft^۟gk Q!(jmF܂lǡ]šwdZRt|)WZ m~ZRUGykPV1Qb"<(cg֖O hMeubʑM%ow֟OکE2Lq-)b aZ *_u(8[l{+4,Oԯn8Q?ϦNThv[]m5yA>gZݶn1vu E%ϸEY(Ɔ/ޮh(RB@l^3R'J=&'a`?=Kr}n>%iwN5h)ptjZ@naf$`']$ZͩKOHVzxF/diP _ {ozֽ1R4yuj$j >Pq*TM5 [=Bn5,b&pYjf#osu%?>NٔOT p*R9M%r ])ֵ.$+Op((mw=p)3^%ptwwɺVJi~N5s5qԸ6~pUydC4%:sRWI8Oҽ\V]Z,<{Ov'Vc^#AѨVeJup׌gZ5,YNKF=CO%iहzݜ9G!h: &7 q A)N64L+Gʺ[EqDWQMbt7  z򁵛&7N?ݩ+@ S5 +=O>B@[r 4=eu~׏_Z(L$,e|W&eJY3PJ %y]ycGqht볼8yĝ׆lNv {Y.*.{.p Ln[@\!A$%xqMnroev^ө YBfgrȲ\x ZQ q Ǽ7NBן^w|Z{/7zz՛~a0υIN\Ua~anwgႠuJtW?Cv*G-0u,x5BΚf])vMɣ_t"7>NБ|o:\H pBSgbz Ɲq$*Ey+\A0ěԁ Ѱ9fyt[h3 DߴPC4U&;U U~e"GAǭxƕU,H8 8k-/޼ҫ̖(6!0hd GRŰ-zjylHN=vi\j:.-^\ϧXvj\2 %H=pCމjJgVjfq;,uJYV7m <}ԡrDƣHxķ@Ȕ0ywE%\8Ɗxy0K|=q֢Om&JJ!Y:-&pzC,h;yxJ0Y`!C.(@>JEbs݀9npA»iɅa @` !LiAp~a pu>.}avwxًR>kpǬzd b+(t/S+l~~F\=x^3G6T>TFp\0C]RR幖/XвqmHԿ}:)[W<[{]K-Lή#fM adhPe;#ׅ,|cTC|SdJF#=' }'4ྈ*N޽hȒa.MӦv`,ۦɳLKd}{ cIaNIa낟/ro]R ~.IAE7.|;w} b f ÁpXs3M1qJ8WX{X^ CncSp6 K^zg3#3{ȗ,)U|z@-5(wf oŜW#! b_٬ ;b_ri6uc200Thb&u.w)uWPJ1[8t|qu}R/\NYOY┺}v@*`mZந@,g+Q65B.pxfآ3ɴ Od $N5Od<*E\vW,{9/J--J7S8i,f 2j!Jf:|bva.cf/e=qr׉.$'s9km͝^ g5Ϭ3(zٙg SR cx'?-0LƫbLaOJw53no;/eQm: (-N`\Y/8chvT4IڭdQn晤pJ$VP`D!Nj rdLhcpcţgFbuL Y|YgT۬ϡ'v,]L8#0Ayp=Y?rM=o zHn&uktB#6$|X;W ]'XR&sF: 2$Qb&jٌi+bvrJEtꘌfj.OWUD,?~2&F4e>"cq6#KHX,S+{0MJr,$]q<2JTc DQNab{*'*@L+tpx+{3YZ.tOØ;vjd4EuѺf{l~nXy+TK{L٥{-5tVX?'Ezyv.ޜO&$58F۷|]=z%MzBē`aXO>%1dˆLΙv;2J jrN*0l^kmr.֛ JGRyٳFDˆkSm@!M( PD#- #%bV6I+|~nWe9~=QZH"@Ih5^KdjD_+3fS,Bq66'M !Hd$i4&ibɲ-RR1ChgYl|:e(R?ߠ$s).Ӝ'2\&-)B԰ YW0hӱ}}NU!f%cgϭGSn5C$k(FĮD 0܅T!f/|ӌ dN_J q Ez~}E50KDW ݋,5j bX;^7NR- 96^{skJI7 ưʵ7(# ;.3iMq)uPLD5a#lY/Qpn|\T)xU>Rh%qRjxyryC`  2mVQhԮ,}G 'V ].E9K|nWG%F=n@ h<$(4Y Sy. + RR+f*vXtx3~hõC湒8(^G!_݌YS]: 00yUȫZ=BLc G˻pݝc:]9i>SOf/ƇcL.s=b'yxxgޝoV<7n`td~Lqa bC"3l8r-ʿ7x%̃raRG܈wa8<N ~Ɍܻ2=bmc5SEAH0s=2bY56Ta@cZ}CE*nЋ?}N*wa_o4'~xH|I#cfSL'xDZ4E9lC Ol|ks؞ OToxHx`,GnU`[vJ0+YRbv'ꭁ,璻%W_KYnٛ5^uȏ[ۏׅqQ†ઓr#un>W7)(ߘTa<^ Gadc`f $fo6,_@rэ,'UC9xg 8"Dh|-Tn2n9 a?z!{^1_F_/ >1Lh][l'w3RndaݰЋKw~?|np_7ݬzkLCm4VyW/}I%T8jqL޿^!Ś#4USE95\ ζCtLě NL=EϧuNcV@(6.ƭ`tnRW|wtO7(O%wd-u<JYm;c77Q׮-"?XL޻ouVL4\I!Vd"m OuA}ϯs2QUY?!$vie#`JJC]^o Jw !TB2QP 5\Na; '/mٷ~>vuu1+_g%(Ok^:H GJ{|ʁRTt+Q/30זSoYg?<ĕXEr%3lp$|zzsf>jg`{Y|YTm|}rυA%2yB&sRa/& Qh*c-\<|{#YVm |6˒`@*%";,*jJ >dPKϣb,I_*Y47׻ 0z?Kٯ$RVQS4J8b>d L5Cȕ}ө¨Ì~9k46귵ifE #4-ֻL^qU lQ.sMj[XGc^ɐF!b7#^Gk✪M$,7%8>O |1>Tѣ6E .t ^lz8܃@O=uw7@3'M: p`x\UU1OxoĽ v;n7+VZ>i@rm7)xH+EALtdoq`0yf؞yk@5vΦ8'ybt2 t0AD(9u@-4, L$!{o1+\ p&nX鞣xpY3LM\8IN}Sux{*<e~/=*X_6 3x8g@d@aVq8Eb?x\|O(kGcx69F?, Phb/ !`{gjƁgxF㣗_zzz[gU$wK,,֧ϧ(oh6{`0j*4c"jy{:s76~{;zݽ U'^#PS.Y?5#iPn:ҫ{ON\ܺ+=zuQOA" {4ڑ$C_X{'xkgeP>#ٸ>%OA$#hڝ&[n4C1)Wku=`)@\g3$[ W%];-o{ >S}dOẃ(hc^ Gq-;,閞"|;ktRɀBNwonw7{*7$~?p55_sS"I@W3H<Oi[er=`m|3¿a( ҿwK sKódF#~wىjO4 G&cqք0]6Am8”J e.ߏd=U /53TX=Je|p+@!D6;%`)B~;{]FV޷A*3HIeFU,5jH-$jR s"S3Hׯ(]%(X/1* 2 7+e|`L@b7Lf.$?&x?85I ?³_NEn f⸩5HJLY;*`4EP䊇p)dxoF?|)XXRDB7Z+2FBUMIQjUZL b&-'~qU#Sd&DCў|)jfP IĘCM4FgaEրd4Sj[N 0'ow[g3 U1&&j0VJrp˲juS?fzZS [CIg'Z^ /IW$R/UQ)ǪQ n$ [ay.\[ti:տH ;<1Rp˶m#)m]BufTJk'|%5V%]&#I,62;#O%dDp˳@B iv&kBit7e{upQySK;}GSݠR<O?5z(yCt۪XF*UdI0yUKI/|5s$_,$?*~8LTrJ\pB,U H%edNfo|rs_/2A+UJbq8p_ :P:w9-*y*͵b˾x/-oIdl^_[%cY~=_PSU2L,+ ݲ$wVۛs8`q:AC) @acbjQ[ܫe+ދ 0^JZ@\0%aRgik=H e.eŶV& 'c _2z2[i[)HėD @4.uJZt\tfJi{@68K=zU,LjЃwLb }9mfFl(!Q>wP<^)Oǥ9v<SwucȎunNsFCBdDe6ĩHVH㹒9.z[( ф ;%\cM?IP\ͽ/')3@1OXN ᑅGUIK °SJ{|}oVeLF8`#ŠB`Q .9>$[<2k\xd?>t_Fu4F&hrG5ͪ(^I!PbT%uZݾ;K+)~ro'w띵Ng!eBjPPMP,αA_ *YeEek%4~kx2.-'&,E0;t2$ ƞ@cRKڵ 9uVpjWh:I__ZGXrxt+֑8lh#M!I)0kI@8fZ:yr< :g%HL}")妩ZM LNs ɨQ3R0|k7#a|/J%AA+d8UTr\p)3r F۠THY~8T)zP'"ctB $Q61O7@Lױ^ZGn+\JW+JEj5g=҅?f& 7m̛ǬvlYjQ ~xdсɨ?-f O.I}$ H(P.RDU,f)iA˗f ՓǼ۝F:%O- 'O&d:*Z5M2cII<2x-mnڍ9֧\HǸTmj*NKCt\6V_?^XKC 8Qg 4D놢H࿞kV[t?M_;^zAw'V1 .@B7;>\W Sw*ߗHEIƍ`< tuWo)≄,FSH$S(6*h7i/7w?/$\1H=>Y`L{8 cP-K>qU :9?KbW ߔ[<)S8hJ BA y 亀Q符W>m'5$W.p\ѭet܌(NX2j␖"L ҅EHvg+:y|/mv<($Դ"TI [..9P'jADITCHpsa%K_JkA4-B&XTLFcL!@?2rZza:p'CBix0 75McjZ\`:q OStN^Cq[,svvrDD>@V挻)o$:0OO$ }(DC1 wbt2 /`-1B>B2OԵA3XXH $VH "Z !יFM]g<_#r iSRš֠ΆF6"hT58:]akUdX\iY)Y␱igZ?-AT#D"Hc,C~6U(\YS&̨I))egPS'ba Dͦ5B=duaڮ7wM}hq;lo/ًzlxi ㈪L8 e5),3\O凷k !+LKDV%CP|Zc)edb!S˕գ#9M)K/KGZ8^dlʭcm OI#PO(F&S-e\VlV #R5dJ#Z[4`٩KiFsJae%DعDۃn(/`ˤJDh`VFOPy5 ;eu”XxӶw_SaK@Cx7C t<+Gq( lSKUZzXr |'^bߜV?il(әܺtmqbrxޣdޡ5E˪V#IutfbM<2 '"Xp։pND ɥ'aQ"gsjo WJEdCĬ}sǎicߴ oq 繐I&Gv3bs$e켵iw2X xz=|+<{WnB&)a&ã`vYT۫"b;U[ȎuĠνnxz=BSU$ 4m2TRyZC>T,.йiVuf0*;dNnBKHn%:ѰW|йmv' 4$wWp.- ΁c.(yO OH(i8"e R T(LzɹSq0b^O"|$~ӜǏ4M CfWTɝUv5A,vԗx[ xqyͽ$!Dl0)?|%|e"*p*-^T|cSStG8 f:k= [[`/"‡^/" xg? b SQ6FÀ\sM˖';[wjT閵"B~ubNLF~oŊ,Qx8a c%Ⱥ pQՔu};1l#?!T>44AMI8T }ea.&q&w>W~ދZ,B@\n]d*)Z0RmJ,88ϡE3LZ㺮XZr;&Zӳ^3;\BR5u^# WtKoqBA>ʶǪT"bŪ'S؛BN #rL4k*2˥^]₢I4ŪuŒYY-kAp% tG㑯L/4t<$`,J=1prO, X׫Io'P,)x2m"|:4qt dT.7uW:TA=fIK9i,M) Su$dvUaa؍f4z.Aܺ$b 4z1|GEi=DM4L&q3vۮP Px5%`ۭ^?;H!+bha1JbC-:tL_E졾!;x|%0z ެhjoN])&) eniEf-jB,f$'Iy%LPJIH1CPc0WOK1Avr5a d+5kk+ z/oSORtP0ؘ/ˎ1ۑi"ۗ`0^۬ ^~8Ys, $N3+*& > 9cI>@-iսm&@uQ"BϬW0ʼʒۮs\R(gJkDh,]W=D^Uq2̺] KVvE[BԆ>J. L iHW2UZzZ@VE-o?IןYGT#&&XHS)CsV$3Y- B"YU\uYg I$Qsn9kGbSʰ h,8KTmoQ@Be [^9wx EZ 㟂gT)ׄ0>;k_}RGC )-bN:-*ёiQQoἰo25/$PlN&LdFd|P-y%WvN9b44H'EKt}f|./J-S$q)5 SլLnS豵?z.ՕPfI8nT C8\o0xk8p?8s݇ck37$N $H,ṋ̃Jŀ:nĔ#n.p *(v1'.m\e`(&<۱ٞ!KخL;MQSB8ߏ:}DQT ,f$u$UYϔ ;q=S:/u/"GMpDisFL6|EGPa`wx.eeN^!F2.~фB}qU, *T?5w/wY%fZX#;|H ԃ0IӑO B&R?J nY{uYE<l%W%ޕ 4xC>?O tjNa8 `rljVG_h 6>+ qx.Ug1~'M"! !iQ7 Q;q{=^uLcb삨uWq-}a~_ʠ6ń[TJ,YQ}:*uBL@ t ;6Ig}7L;*6KԖu,j%nTA|Py<ؤ>Lvn{M ذL;S*CdE< \/e0h-|0 \>@,@|µ.c_L5I׊Rd&@ظog\Z9[ -U;W`!JU r:XX侐?@Fb< G 8_ ,1lL#LܢxӃfՐlp>W`~SƯ<~ힶN{F+5!!;C\\.YUcDXۗ?_}vF\x.1Jٍin:f> 12M͸xzEܓ6hyZ&uSqte*ß(w[xlU(1jQBIkf&U˅r*un7jN׾z) 56V-jɈwxhS]/fѺU] .y,:vKeyN0\QkWPRUg+*:ʼZ{ z9 ϥ;7ݚž&N-ꈀ/0ZxC)lkiD >/? ~d/؁~֝U."4lL?N8Րf Ǣ7~hnG jMSa#ia6t@@*elƒK+bu^pvY_<ȿ:~3(n1acdډ%G0v'W*9 l.`6HcO&jz鸱",1=T A곛~l7.cnϭ%;qt- H#)@+L\ m.eY%J[گwF aIhuO]TGFBP!a8ղQF .95CWZF!v\Iao'obtZNn'D&BN&Z( !t w!pN.ߑR޶ܺ=t`~$Bj x}KGсXAq{} ;e =_n ϥ7n;A;&*k!pc2-WABeĭK#x$BN3&?zppJF> w V.V&9abYXȱ5Jdzv9]!%V7<^DflHԢF0 @;b6g- *`iom:rc!xsϝN}:K^2J!d4@Dž| $O:]0uA-oǦ,U[O_1Jpk C)xOV-Z5cnKKav#Ǟ[O40~*'"$h`\.3piGH1WǺmSZL6ϭ}\bbg|vD8%aV,YF!ő:$Զ)lwՕ/$bXr<ᛀ%6k@ 1l4"j{|F3bߗ729̆&p"!MBP&˵g|c+@ah'otJI>>WI:U[As.$NHt'tpfuXt&^ v$gWf!h9!!1Eܬ1م12-,XYxU,]Px~ $\ciBSR*8cH`LL4MGg;8M FC_X% WO7\+.Hd3d|p;Ԋ\6igFA5~~OD~iKQ^o022sSIaalTWHiת)m*~T|~OP(-6F6dpGuu*[+p[ sYVrSxQ`Cֲj8oi:cj@jfEcm$NmNWW$ohz2l(I ؟r3[ΑJI $c٪mUUldEu~'_X8t:лY1xcͪ+VF)5wpXGAKBλNo7}˾_]\xMK;=*V5Nw~ޔX  [Pgi,ǰc5D>,Gϭox)s7;ALűe0o2f;YNTJaqI"Fÿ[ raͩOIM ^7>Q8=B*(qs:-+ %t\JS86O7@ (2vw(tzv<1B&> \@ax)HtR PNDIciq'n5@V9UݓqiV s|Mf!7-F-ˬDðR&95$q9禈nNw Q YҖi4&)RI6X,׋B"ecU}˱+0ڙ>K}~g}3=8;CBxJ 012MKT.ދgT2=йqkwNg=`NTjaGXƛJ&D5ѶYZ}G{Q`\Y(PHNec4ƣG%r\a;Tn/nMVQt)u|bi6MtMxhDKW-\{`z} (( #${YbY qS'I&$ FƊ(fdF䚁ר 4'b34}'G ;^M3ޓ])מLq6n˔0UTm!e6 QZ`^j7ckMĪݍVJOtqwPD* @眭~Z^[6[7 (!^LU95=*gK}=/Q>۽Jv )]ϯP^Yw,E4&X=:QkaN}>԰U7gT %yWU7] 7Nsvd2h1x ks(^ǔi[\b2 J |nvȬ'c.*Gr]6c͈v4W(/mee;uL_s¥2˱D4K#P DLY<Ѝ9*d2j摣Q)ɔL9wtX'ޢc>~1ƇOFaUVZe:eTFF.QZn_`"ZvɈ0AmF(@-XPqqGCB?`o!I"R.|ŷfF8U!"a)3ǙvtdU6ysMw' %k 2Y[7:~w0SZBp{مµ%<`kcP(uz 8S3)A[N@Cm<@EgDGX_vb9vkq6vzқ7! t0lH ) \k6f^saƸvYk휷\ii^Hd1BLƍ1Veq$(DV!'<\ӕ.ONOȼ/a-Sjŕ .em+@6·LD '^HW3ze7_0'_0`Ft%M)O-A?&Q?:()iY"P?tyYGlĕJ˩KcNܭ&pN:so6k zhz7E.~0hϴKj^é6UF á)HQ/7 )6B *(rRKMh*2"dvmp)|8W. Po|a7$I 2uK!޼HSêumf]е`7oFF;k;6j( Ehc4|$'Zχ_ze&̵_ķ^x?<8vݪ+ r=[9!U]dt7 =)H RP0_ʕltt\$;ԻF'ugߗʧ۝NyњĠN'f٢iVs!$SP`ƦQL\l;_XG%9`JdrJhul(WVm2(agK#IJ8Oªp0!ĭxi9sJ.l g1X,K͒^MsB9S&FRTEUr䫔rRQ##vsq78?!ݤ7:Bq9U-73ȫfK<7U υchr.lq)/qȦ=;meF̃W7%}(&|+\-#{|$S\qS5HP0MYpXrt+ZZQ5 [y^\y!I)d#`&g'5 nm-^;Vt>cKoA0- )bI \Ge" %Xd^ީۢm|1D 7b_V ik)q,YcWMK xߋf̩![S!P0u ɉ})s㞾fC7^V6g@x_x,@3H!׌̴qꔌlSgJVA+r{   -T)C%TH6BVZH%(ޚvUM1j0^7se_\e/=ó^+뜶Og]IOMepWQ9ұg/#~wڎ麵mn#<cB@6K Pl&h*Tmi0)%R2joW= jKN~T|-i7d$@Ysۦa VmJjэTJ2RipR.1\ȥA. KJ&>|/-հ,ӬڤZ8,nȐXceX+r7{傴dFUI җLP04iH(=99N8օ_g[X]LU GUF{x>saeNV=KJy^ &BS ьɵ+d$g{R̓pȝ F5`YqeT6*F͒9߽ytnpbxst͹Է¡hَܮD CfB= pC|Nj%ꋉ@fﴺ<$"PVCZ- ̈tJ䔚F%H}vVjXU(l8!:w'y&g9er_HxyBʸ8NGU 8~6p^V9qUR̓-\s>ls4Ozy ߇s!)'zMkWvv*jKQ5:3fAǰQ=Nd IZ(ElQl[ҵb𽩊\z݁6#N֩dv# P!g{s:%os՟8 M <{wB]\2>/sLUe"e(I,9GqrWpu4iL6 އHPtcI )CE8\1+rYɔZ F9eFNoXf.v҆woIe8nuv6sSNJ4UI?txDqWfnYf-W3Qۯ|mbbߟ"q[?Zp(ÿy\ɫ|>hM6UM32 ^Vv1l_ .T{Ҭ|{$^HU%>4I5OTq® Mj:ccQK:Ӌ㓐 r^J9؜52=SEcbEK1m%؜Ւj09zkK8Zvǡ{Z0;.su`I8Y*]/vTrT˦Ay)QNN [,TiTT] l$Uu\aI8dfU5t-zºmrO1vQ?80%i GA?<f%W /f նXt\!-&b'}/~x-z}/%"Nn::` 4#1 E>`$Bz)RS"i#,SfS+:%K-g\ V{61B W:rE7i.Y|UI9rr>>j_ZYHd-4<)|tWдmU P-*YQ;Գ Edn]Tr=0><{^fIƊ0,9R%tR;.c0m7~kН^ 1 4HoFKCDlhtOn>۱F|0>ec\\{1_P B1=ʲl&-rjTlɌYe 74uƅuAj\oƛ ĖKIF"Y;/%Cwg\Dbq|G*Pգ5Kd T06k|Um$ \u",;Qw9=nDs` { lo/Zfg0X1Spk[cKgO87uN$hN賗,V*SLb1x`h\89fz&wPRգJLsB/neh~Ec A;M}i#vy낺1u;ʻBÌ- /[YA9Qx7StWМUaW04F(*QV=ը^˒jr¾m4>RbcvqiW7{`,é `4Y6QC ˺22kxbTWv-mD/pXX&H~b%XRX fk;xt J~|7o_.U|^y7n*'CAJ1P,fsRTTjׯ}-U jU kcV/;+EKOmhDJS1:XP%rr%)WFjMr9tdDqeSӾKB¶W|6%NM!BLPjN;=OLa9*VY{DCF iw)x ĘLƘ 5qNd=Z{Bڮdq qg7#nbzf^Z+ w~ dzb+I!&iBKed?!MNAE ^?*J4 &wE6 mW HAqڕ+*ʁgqJT=QyJS/Wi1΄u$i@nLU FS3|7),o-{}?xi}A~)|Y[TXT0vFѶR2ͨ坜&d\5-l\Rpԓ/ϩ&E|5S$i8bJ8O#GOI݃'©{[~Y}jT&yY:/f.VFh0)\ YnF)B$;p!&ຶXC,aKIsK#q* s`+]1qzD`Rvt m0uMG_(S /8j҄8\\vo^s` hc*zlcUQ:&MLR t=>7/>Iۿ^Խ6T4:QJd(DkJ݉*N4wҨ/DQ"Qկ|kɴtpuΚ3?%c_UJId>mUqyu `)8RuyLt-Ł*?,AMEYy:X bٹESkYHK$ ǺmމUx#pTdrH6 1_"븈ܡiS2e(`<&-6Qã­S>Cei[KwM`4ozng>vaF? F1+pU8׽\N*[׬4 |kԫT2IabSB<װ$U:eoen9SV;E+׭؎]Ky[u6vzHضcNXB!K,Zt^Up+YQ"ʅ;֊C= 9gb#i2GxIQ:v 9i䎅!e٢ Ԍyw'&&Lg%A(MFd:%ؼP⫖n^!V-9-S͖vjCsi [g:E"a㉢BM^5h窹RN+b\I[[)oTCnYӛW")(ʨ!)ǒ6ÍDȪ˘pL[/K )>AΔ 'D~nbls@$϶%qL hc> 9r]<;;n`q K(\{6:}S85uL k8? 3`%1On/I}JqD}Efjdf3f3ޝZfͪYwCU"I 6Ha|O'SH5Yg6e[*MiUՙE!:nV_w.(d+ߝ1g&KA N!^y"2{]b<}*ȗ'.A(?>@HDD%a0!nԍe&rzu H0?$@R >;I縖7hBVqHK H0|(]1Ip,a0 ©6`W LmYGyl{/L0|8հ  9Dcۥafsjs"wlj;[MMӴWw 1݆~6}I ߳^g d"x*aNML>,㕌}t`hj`ٚծA^}H{Ϗo5^m\4\%!eCJlz!^?+.ă }KdSƲzR-kb!(Ƒ\)Ӻ:o 4Պh;\Ata|\ +G\i3idi& m* I$6IӷbgkDpgzip-1.2.6/testdata/test.json000066400000000000000000004432421431554437500163600ustar00rootroot00000000000000[ { "_id": "543fa821aeca0fed7f182f01", "index": 0, "guid": "3526d142-6d2b-4266-9855-e6ec1589a265", "isActive": false, "balance": "$2,156.72", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "brown", "name": { "first": "Rosella", "last": "Hale" }, "company": "SKINSERVE", "email": "rosella.hale@skinserve.net", "phone": "+1 (920) 528-2959", "address": "324 Imlay Street, Sehili, Guam, 3022", "about": "Est consectetur ut incididunt commodo elit cillum incididunt consectetur id officia pariatur pariatur cillum. Ipsum non incididunt tempor non. Cillum aliquip aliquip non minim ipsum voluptate incididunt adipisicing aute pariatur laborum minim deserunt laborum. Do do consequat enim adipisicing dolor incididunt reprehenderit sint. Veniam dolor consequat sint ullamco id enim occaecat.\r\n", "registered": "Wednesday, August 27, 2014 9:12 PM", "latitude": 43.44586, "longitude": -65.480986, "tags": [ "Lorem", "ex", "magna", "aliqua", "id", "sint", "elit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Etta Stanton" }, { "id": 1, "name": "Cora Velazquez" }, { "id": 2, "name": "Deann Guy" } ], "greeting": "Hello, Rosella! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8218066e8499ef38bcc", "index": 1, "guid": "991a35b5-91db-49e8-8a1e-13688b5ed88d", "isActive": true, "balance": "$1,762.71", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "green", "name": { "first": "Rose", "last": "Lynn" }, "company": "NITRACYR", "email": "rose.lynn@nitracyr.com", "phone": "+1 (912) 564-2131", "address": "485 Pulaski Street, Logan, Mississippi, 7453", "about": "Minim proident enim eiusmod reprehenderit excepteur laboris. Adipisicing culpa cupidatat eiusmod exercitation reprehenderit anim. Nostrud mollit reprehenderit reprehenderit id magna et id esse cillum et proident. Incididunt eu nisi excepteur est est irure voluptate id nulla. Laboris consectetur aliqua cupidatat ex elit proident officia ex quis. Minim officia eu eiusmod velit. Ullamco dolor non quis aliqua cupidatat amet laborum laborum ad ex proident qui eiusmod ea.\r\n", "registered": "Sunday, October 5, 2014 10:36 PM", "latitude": -3.548698, "longitude": 79.421107, "tags": [ "exercitation", "adipisicing", "aliqua", "do", "id", "veniam", "est" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Ada Little" }, { "id": 1, "name": "Lopez Osborne" }, { "id": 2, "name": "Tami Leach" } ], "greeting": "Hello, Rose! You have 5 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821255974bb9f89e5ea", "index": 2, "guid": "e5727238-63a4-4e1e-88cc-67300826259c", "isActive": false, "balance": "$2,131.97", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "green", "name": { "first": "Gloria", "last": "Richards" }, "company": "SPHERIX", "email": "gloria.richards@spherix.biz", "phone": "+1 (884) 536-3434", "address": "493 Judge Street, Cetronia, Rhode Island, 4439", "about": "Lorem cupidatat ea et laboris tempor enim non. Sit consequat culpa et qui aute cillum ut ullamco. Nulla duis sit Lorem incididunt mollit nostrud dolor veniam ullamco. Sunt magna id velit in laborum nisi labore. Id deserunt labore dolore dolor aliqua culpa est id duis.\r\n", "registered": "Saturday, March 29, 2014 8:18 AM", "latitude": 60.328012, "longitude": 126.657357, "tags": [ "dolore", "laboris", "proident", "cillum", "in", "fugiat", "incididunt" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bowen Cote" }, { "id": 1, "name": "Olga Gardner" }, { "id": 2, "name": "Evangeline Howard" } ], "greeting": "Hello, Gloria! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa8212b7e1e8201a38702", "index": 3, "guid": "bab757bd-2ebd-4c2c-86b7-0d4d8b059d35", "isActive": true, "balance": "$2,509.81", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "green", "name": { "first": "Casey", "last": "Hayes" }, "company": "SURELOGIC", "email": "casey.hayes@surelogic.co.uk", "phone": "+1 (993) 573-3937", "address": "330 Tapscott Avenue, Eastvale, New Mexico, 928", "about": "Eu elit sint sunt labore dolor cillum esse ad voluptate commodo. Dolor aliqua do dolore ex tempor sint consequat culpa et consectetur nisi voluptate reprehenderit. Dolor velit eu cillum tempor anim anim. Nostrud laboris eiusmod elit enim duis in consectetur esse anim qui. Et eiusmod culpa nulla anim et officia pariatur reprehenderit eiusmod veniam. Ullamco nisi ea incididunt velit. Ullamco cillum mollit ea aliqua ea eu et enim.\r\n", "registered": "Sunday, September 14, 2014 8:35 AM", "latitude": -43.494604, "longitude": 95.217518, "tags": [ "officia", "sunt", "dolore", "qui", "elit", "irure", "cillum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Serrano Wise" }, { "id": 1, "name": "Lorene Macias" }, { "id": 2, "name": "Kristen Lott" } ], "greeting": "Hello, Casey! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821bfefa43403d5d054", "index": 4, "guid": "675d1598-8c45-4d67-a4df-d38a270de371", "isActive": false, "balance": "$3,887.07", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "blue", "name": { "first": "Price", "last": "Oconnor" }, "company": "ANOCHA", "email": "price.oconnor@anocha.tv", "phone": "+1 (855) 410-3197", "address": "447 Stockholm Street, Templeton, Wisconsin, 2216", "about": "Cillum veniam esse duis tempor incididunt do dolor officia elit eu. Excepteur velit reprehenderit minim Lorem commodo est. Duis Lorem nisi elit aliquip est deserunt fugiat ut. Nisi tempor ex est pariatur laborum eiusmod anim eu nulla. Nisi enim id aute id ex id nostrud.\r\n", "registered": "Wednesday, May 14, 2014 5:19 PM", "latitude": 26.083477, "longitude": 122.61114, "tags": [ "in", "ad", "aliqua", "minim", "nisi", "cupidatat", "id" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Montgomery Mccray" }, { "id": 1, "name": "Lucia Ferrell" }, { "id": 2, "name": "Glover Brock" } ], "greeting": "Hello, Price! You have 5 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821a699260d8ed4439a", "index": 5, "guid": "5e271270-fef3-48a7-b389-346251b46abc", "isActive": false, "balance": "$1,046.50", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "blue", "name": { "first": "Rita", "last": "Huber" }, "company": "VURBO", "email": "rita.huber@vurbo.name", "phone": "+1 (803) 589-3948", "address": "838 River Street, Gadsden, American Samoa, 2602", "about": "Culpa quis qui exercitation velit officia eu id qui consequat qui. Ea fugiat quis fugiat proident velit. Velit et reprehenderit quis irure adipisicing duis dolor id cupidatat ea aliqua elit.\r\n", "registered": "Friday, April 11, 2014 11:56 AM", "latitude": 30.717665, "longitude": -29.687902, "tags": [ "veniam", "ex", "deserunt", "cillum", "sint", "eu", "proident" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Oliver Terrell" }, { "id": 1, "name": "Lora Shepherd" }, { "id": 2, "name": "Guzman Holman" } ], "greeting": "Hello, Rita! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821b888230e87ce950e", "index": 6, "guid": "7e4efd9a-4923-42ae-8924-d6d5fae80ec0", "isActive": false, "balance": "$1,205.59", "picture": "http://placehold.it/32x32", "age": 30, "eyeColor": "green", "name": { "first": "Peterson", "last": "Oliver" }, "company": "ZENTIX", "email": "peterson.oliver@zentix.me", "phone": "+1 (924) 564-2815", "address": "596 Middleton Street, Walker, Louisiana, 3358", "about": "Exercitation cillum sit exercitation voluptate duis nostrud incididunt cillum sint minim labore tempor minim ad. Esse ad id pariatur cillum id exercitation ullamco elit. Quis nisi excepteur mollit consectetur id et. Ea voluptate nulla duis minim exercitation aliqua aute nisi enim enim excepteur dolor ad non. Aliquip elit eu enim officia minim enim Lorem tempor. Cillum anim aute sunt cupidatat deserunt consequat.\r\n", "registered": "Friday, March 28, 2014 2:28 PM", "latitude": 45.092029, "longitude": 56.730029, "tags": [ "in", "voluptate", "sit", "sit", "Lorem", "reprehenderit", "esse" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Wiley Henry" }, { "id": 1, "name": "Downs Rowland" }, { "id": 2, "name": "White Guerra" } ], "greeting": "Hello, Peterson! You have 8 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8210f8589ab846b3d88", "index": 7, "guid": "afc25e30-7e70-4a87-bdd3-519e1837969a", "isActive": false, "balance": "$3,928.85", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "green", "name": { "first": "Shauna", "last": "Morse" }, "company": "CENTICE", "email": "shauna.morse@centice.us", "phone": "+1 (926) 517-3679", "address": "752 Dunne Place, Ebro, Kansas, 3215", "about": "Cupidatat incididunt sit duis tempor labore dolore aute qui magna in. Consequat aute ut veniam laborum aliqua Lorem esse. Cillum in qui sint excepteur eiusmod eiusmod eu anim adipisicing et.\r\n", "registered": "Saturday, September 6, 2014 2:32 PM", "latitude": 36.341849, "longitude": 108.378341, "tags": [ "in", "nulla", "labore", "qui", "id", "enim", "fugiat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lizzie Carson" }, { "id": 1, "name": "Eliza Hall" }, { "id": 2, "name": "Baxter Burton" } ], "greeting": "Hello, Shauna! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8213c997bd81d4a7fa5", "index": 8, "guid": "1337ad27-17e3-459f-90a3-a43b54b88184", "isActive": true, "balance": "$2,096.67", "picture": "http://placehold.it/32x32", "age": 24, "eyeColor": "blue", "name": { "first": "Glenn", "last": "Brooks" }, "company": "MANGLO", "email": "glenn.brooks@manglo.ca", "phone": "+1 (895) 595-2669", "address": "605 McDonald Avenue, Nicholson, Indiana, 2302", "about": "Deserunt incididunt ullamco dolore nostrud cupidatat sit consequat adipisicing incididunt sunt. Laboris fugiat et laboris est eu laborum culpa. Labore ad aliquip ut enim aute nulla quis cillum dolor aliqua. Culpa labore occaecat et sunt qui. Velit consequat ad proident non voluptate non mollit eu et cillum tempor. Velit quis deserunt Lorem cupidatat enim ut.\r\n", "registered": "Friday, March 21, 2014 9:06 AM", "latitude": -40.51084, "longitude": -137.771438, "tags": [ "enim", "laboris", "culpa", "do", "nulla", "anim", "cillum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Shelly Cardenas" }, { "id": 1, "name": "Kristine Mendoza" }, { "id": 2, "name": "Hall Hendrix" } ], "greeting": "Hello, Glenn! You have 10 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821054bcf388259b272", "index": 9, "guid": "cd9601fc-7ca7-4d54-830b-145ff5c5c147", "isActive": true, "balance": "$1,816.14", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": { "first": "Maribel", "last": "Small" }, "company": "FUTURITY", "email": "maribel.small@futurity.org", "phone": "+1 (825) 532-2134", "address": "424 Rockaway Parkway, Vale, Alaska, 1834", "about": "Aliqua irure culpa exercitation nostrud qui exercitation deserunt ullamco culpa aliquip irure. Proident officia in consequat laborum ex adipisicing exercitation proident anim cupidatat excepteur anim. Labore irure pariatur laboris reprehenderit.\r\n", "registered": "Tuesday, July 29, 2014 9:59 PM", "latitude": 53.843872, "longitude": 85.292318, "tags": [ "dolore", "laborum", "aute", "aliqua", "nostrud", "commodo", "commodo" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Anthony Bray" }, { "id": 1, "name": "Vicki Kelly" }, { "id": 2, "name": "Baird Wagner" } ], "greeting": "Hello, Maribel! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821f14efb6f7f1210b9", "index": 10, "guid": "c9400d51-ea8d-4748-9a10-fa0e3a037b23", "isActive": false, "balance": "$1,395.15", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "green", "name": { "first": "Kendra", "last": "Knapp" }, "company": "UNCORP", "email": "kendra.knapp@uncorp.biz", "phone": "+1 (830) 509-3054", "address": "765 Cameron Court, Ferney, Florida, 1963", "about": "Duis irure ea qui ut velit nostrud. Lorem laborum excepteur do qui ad sit culpa. Labore mollit mollit deserunt sint aute officia qui laboris dolor aliqua magna in officia.\r\n", "registered": "Sunday, April 27, 2014 11:55 AM", "latitude": 84.200593, "longitude": -155.377179, "tags": [ "laborum", "labore", "aliquip", "ex", "voluptate", "dolor", "Lorem" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Marva Cash" }, { "id": 1, "name": "Aimee Velez" }, { "id": 2, "name": "Eaton Delgado" } ], "greeting": "Hello, Kendra! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa82119105322ba52b407", "index": 11, "guid": "b6862230-95da-43d5-97ba-13ed4bcc0744", "isActive": false, "balance": "$1,442.51", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "brown", "name": { "first": "Katrina", "last": "Ferguson" }, "company": "MANTRIX", "email": "katrina.ferguson@mantrix.io", "phone": "+1 (938) 541-3037", "address": "447 Putnam Avenue, Collins, Georgia, 8421", "about": "Minim aliquip Lorem fugiat et fugiat esse aliqua consectetur non officia esse. Fugiat irure eu ut irure cillum mollit nisi consequat do cillum. Est exercitation deserunt proident ex cupidatat. Elit aliquip pariatur ad minim adipisicing qui. Quis enim laborum incididunt eiusmod deserunt cillum amet enim. Proident et do voluptate esse laboris nisi. Duis cupidatat fugiat adipisicing aute velit et ullamco anim velit velit et excepteur laboris.\r\n", "registered": "Tuesday, February 4, 2014 5:01 PM", "latitude": 43.287084, "longitude": 133.518964, "tags": [ "magna", "officia", "reprehenderit", "excepteur", "cillum", "veniam", "officia" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tameka Mccullough" }, { "id": 1, "name": "Madden Vincent" }, { "id": 2, "name": "Jewel Mccarthy" } ], "greeting": "Hello, Katrina! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821ee55902ac207b17a", "index": 12, "guid": "50161207-4477-47b9-8aa7-a845c3c2e96f", "isActive": false, "balance": "$1,937.64", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "brown", "name": { "first": "Gilliam", "last": "Flowers" }, "company": "INTERLOO", "email": "gilliam.flowers@interloo.net", "phone": "+1 (930) 564-2474", "address": "986 Elton Street, Bagtown, Alabama, 9115", "about": "Velit incididunt ut nulla adipisicing ad qui sint dolor cillum cupidatat in. Commodo aliqua deserunt ea eu irure irure nisi ullamco culpa nostrud. Adipisicing exercitation excepteur et id cupidatat. Ullamco ut incididunt proident est ad deserunt duis id ut. Excepteur cupidatat irure reprehenderit et excepteur minim cillum occaecat adipisicing. Commodo fugiat ad ex consectetur commodo dolore id nisi deserunt commodo aliquip. Veniam amet mollit nulla adipisicing eu minim sit magna incididunt adipisicing.\r\n", "registered": "Tuesday, April 1, 2014 12:42 AM", "latitude": -55.19047, "longitude": 177.975351, "tags": [ "sint", "pariatur", "incididunt", "exercitation", "quis", "ad", "sint" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Patsy Hunter" }, { "id": 1, "name": "Cecilia Green" }, { "id": 2, "name": "Meyer Jones" } ], "greeting": "Hello, Gilliam! You have 9 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821658f3962ce822678", "index": 13, "guid": "7017674f-79b3-43ed-8832-2b787c51f59d", "isActive": false, "balance": "$2,291.31", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "blue", "name": { "first": "Roberts", "last": "Floyd" }, "company": "OVOLO", "email": "roberts.floyd@ovolo.com", "phone": "+1 (935) 401-2916", "address": "723 Amherst Street, Brady, District Of Columbia, 4241", "about": "Occaecat incididunt eu do quis est. Est mollit incididunt sint aute sunt. Consectetur incididunt officia eu fugiat quis officia pariatur excepteur sint. In enim nostrud nisi culpa. Ex incididunt exercitation id voluptate.\r\n", "registered": "Thursday, June 19, 2014 4:16 PM", "latitude": 72.321258, "longitude": 28.548926, "tags": [ "et", "ipsum", "anim", "dolor", "commodo", "do", "exercitation" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tracey Vasquez" }, { "id": 1, "name": "Castro Harrell" }, { "id": 2, "name": "Sanders Barr" } ], "greeting": "Hello, Roberts! You have 10 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821f95ca5383b9eb53d", "index": 14, "guid": "a6532d9a-d291-4a51-92e7-33c50ceecc12", "isActive": true, "balance": "$3,310.31", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": { "first": "Miles", "last": "Valdez" }, "company": "DENTREX", "email": "miles.valdez@dentrex.biz", "phone": "+1 (960) 513-3228", "address": "726 Stillwell Place, Soham, Pennsylvania, 3510", "about": "Sit labore ex commodo duis tempor labore officia et et est qui ullamco. Aute elit in labore laboris magna duis ipsum excepteur anim laboris ipsum magna magna non. Sint mollit eiusmod in est sint ipsum excepteur do anim cillum cillum.\r\n", "registered": "Thursday, May 1, 2014 6:08 PM", "latitude": 88.123309, "longitude": -121.226418, "tags": [ "voluptate", "sunt", "anim", "laboris", "exercitation", "deserunt", "culpa" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bradford Horn" }, { "id": 1, "name": "Hanson Dillon" }, { "id": 2, "name": "Whitley Stanley" } ], "greeting": "Hello, Miles! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821c52f80cda8ff36b3", "index": 15, "guid": "63820e33-a8c7-410e-afa9-32b7f7017a32", "isActive": true, "balance": "$2,616.09", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "brown", "name": { "first": "Floyd", "last": "Barker" }, "company": "TALAE", "email": "floyd.barker@talae.co.uk", "phone": "+1 (843) 435-2898", "address": "501 Sullivan Place, Cotopaxi, Nevada, 5498", "about": "Non deserunt voluptate occaecat est mollit dolor aliqua. Qui elit aute qui aliquip ipsum et labore est aliquip pariatur. Sint deserunt tempor dolore excepteur elit est sint in est ex anim. Nostrud culpa amet eiusmod incididunt. Ea exercitation amet labore cillum culpa duis aute incididunt dolore sunt. Cillum velit laboris quis eiusmod fugiat consectetur sit fugiat irure labore.\r\n", "registered": "Monday, March 10, 2014 7:48 AM", "latitude": -86.397923, "longitude": 171.646534, "tags": [ "dolore", "sit", "qui", "id", "aliquip", "mollit", "laborum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Eileen Daniels" }, { "id": 1, "name": "Genevieve Wood" }, { "id": 2, "name": "Carver Fields" } ], "greeting": "Hello, Floyd! You have 6 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8219eb621c418384935", "index": 16, "guid": "ed67eac2-cfdf-4d28-a734-bc973cba8613", "isActive": false, "balance": "$1,917.58", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "green", "name": { "first": "Carrillo", "last": "Cox" }, "company": "ARCHITAX", "email": "carrillo.cox@architax.tv", "phone": "+1 (818) 444-3875", "address": "309 Randolph Street, Avoca, Illinois, 770", "about": "Labore consequat et nostrud officia ad. Sint ipsum ipsum sint laboris adipisicing minim voluptate aliqua proident est commodo nulla. Officia sint ipsum laborum aliquip adipisicing adipisicing ea et reprehenderit dolore. Et deserunt sint incididunt velit dolore voluptate deserunt anim nisi sit est officia fugiat. Velit dolore ea do enim veniam ut do. Duis adipisicing fugiat magna Lorem ullamco quis sint ut cupidatat laborum aute laboris sint aliqua.\r\n", "registered": "Friday, January 17, 2014 12:19 AM", "latitude": -31.228015, "longitude": -82.248255, "tags": [ "occaecat", "nostrud", "ex", "dolor", "magna", "minim", "pariatur" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Douglas Mayer" }, { "id": 1, "name": "Dorothy Riddle" }, { "id": 2, "name": "Melanie Thompson" } ], "greeting": "Hello, Carrillo! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821e152869356625777", "index": 17, "guid": "1dc17af3-a194-42e8-add8-a73853f16da2", "isActive": true, "balance": "$1,703.08", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "green", "name": { "first": "Ana", "last": "Reese" }, "company": "FORTEAN", "email": "ana.reese@fortean.name", "phone": "+1 (876) 419-2128", "address": "451 Brevoort Place, Leola, Tennessee, 3725", "about": "Consectetur officia irure proident nulla. Anim veniam mollit sit id aliqua. Do reprehenderit culpa magna magna aute est pariatur consequat ut occaecat cillum adipisicing consectetur. Sint qui pariatur id velit deserunt laborum. Minim consequat ut sunt qui. Ex occaecat tempor fugiat sit anim veniam incididunt mollit mollit. Non id anim cillum culpa tempor voluptate aute consequat proident reprehenderit.\r\n", "registered": "Saturday, June 28, 2014 4:53 AM", "latitude": 80.18306, "longitude": 70.818006, "tags": [ "mollit", "voluptate", "est", "magna", "ad", "duis", "est" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mclaughlin Johns" }, { "id": 1, "name": "Leanne Hanson" }, { "id": 2, "name": "Isabel Leon" } ], "greeting": "Hello, Ana! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa82168ed66f19f510aea", "index": 18, "guid": "87be73dd-bf5e-48c4-8168-f8f76cda905d", "isActive": true, "balance": "$1,307.88", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "green", "name": { "first": "Daugherty", "last": "Ware" }, "company": "TYPHONICA", "email": "daugherty.ware@typhonica.me", "phone": "+1 (936) 470-3445", "address": "919 Oriental Boulevard, Westboro, Iowa, 2587", "about": "Occaecat in nisi et consequat. Laboris minim consequat qui proident id aute occaecat pariatur. Sint esse anim id ex voluptate fugiat culpa anim commodo incididunt.\r\n", "registered": "Tuesday, March 4, 2014 11:53 PM", "latitude": -15.007384, "longitude": -86.496257, "tags": [ "consequat", "nisi", "duis", "cupidatat", "anim", "eu", "culpa" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Maddox Wells" }, { "id": 1, "name": "Maura May" }, { "id": 2, "name": "Terry Calhoun" } ], "greeting": "Hello, Daugherty! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8210abc44da895c5591", "index": 19, "guid": "32c4c5d0-b54c-4ea4-999a-f4fa517ac5ce", "isActive": true, "balance": "$2,706.98", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "green", "name": { "first": "Sonja", "last": "Craft" }, "company": "KOZGENE", "email": "sonja.craft@kozgene.us", "phone": "+1 (808) 410-3427", "address": "808 Lawn Court, Blodgett, Massachusetts, 560", "about": "Eu occaecat reprehenderit ea ad ullamco ea sint cupidatat ex. Deserunt eu est veniam consectetur do anim in. Dolore minim veniam dolore elit sunt labore id eiusmod.\r\n", "registered": "Sunday, August 31, 2014 12:09 AM", "latitude": -47.101894, "longitude": -130.294589, "tags": [ "sint", "cillum", "magna", "sit", "fugiat", "nisi", "reprehenderit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Loretta Mcgee" }, { "id": 1, "name": "Wilson Merritt" }, { "id": 2, "name": "Susanne Lloyd" } ], "greeting": "Hello, Sonja! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa82134480e13e931193a", "index": 20, "guid": "c4a7ded5-aa3e-411f-9956-f4b938ce93dc", "isActive": false, "balance": "$3,216.50", "picture": "http://placehold.it/32x32", "age": 23, "eyeColor": "green", "name": { "first": "Powers", "last": "Mathews" }, "company": "ANDRYX", "email": "powers.mathews@andryx.ca", "phone": "+1 (914) 559-2596", "address": "545 Nolans Lane, Brenton, Arkansas, 7607", "about": "In irure et tempor ad commodo culpa reprehenderit excepteur tempor ex. Exercitation eiusmod consequat anim incididunt veniam duis sunt velit sunt aliquip esse adipisicing do. Elit ea incididunt id amet mollit ea in ad ea cupidatat duis minim consectetur incididunt.\r\n", "registered": "Friday, July 11, 2014 11:27 AM", "latitude": 64.259332, "longitude": 111.604942, "tags": [ "ut", "ex", "cillum", "commodo", "pariatur", "ex", "reprehenderit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Woodward Witt" }, { "id": 1, "name": "Hazel Mcfadden" }, { "id": 2, "name": "Desiree Mclean" } ], "greeting": "Hello, Powers! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821117e0b8bd3f6e566", "index": 21, "guid": "fae9ba5c-948b-429c-b1e6-a0a6835f0694", "isActive": false, "balance": "$1,046.41", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "brown", "name": { "first": "Lola", "last": "Roy" }, "company": "EURON", "email": "lola.roy@euron.org", "phone": "+1 (920) 413-2000", "address": "237 Tabor Court, Berwind, Hawaii, 2276", "about": "Aute voluptate proident occaecat exercitation aute proident ullamco veniam aute magna velit cupidatat. Occaecat dolor aliquip adipisicing dolor do elit eu elit laboris officia magna dolore. Velit tempor sit ad et occaecat nisi elit excepteur. Non velit sint deserunt culpa magna irure.\r\n", "registered": "Thursday, February 27, 2014 1:20 AM", "latitude": 12.90929, "longitude": 68.693395, "tags": [ "ad", "officia", "non", "aute", "magna", "minim", "sint" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lee Tate" }, { "id": 1, "name": "Miranda Payne" }, { "id": 2, "name": "Jocelyn Cantrell" } ], "greeting": "Hello, Lola! You have 9 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8211cf627425d947100", "index": 22, "guid": "590c913b-2457-47a5-ad5c-8a5fc3c249f9", "isActive": true, "balance": "$2,144.16", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "green", "name": { "first": "Marci", "last": "Mcpherson" }, "company": "VIAGREAT", "email": "marci.mcpherson@viagreat.biz", "phone": "+1 (916) 417-2166", "address": "527 Kenilworth Place, Bartonsville, Puerto Rico, 4739", "about": "Duis velit irure sit sit aliquip sit culpa velit labore velit ipsum amet. Pariatur labore ex et sunt proident ad minim. Aliquip qui adipisicing elit do sunt mollit irure adipisicing in labore cillum. Ut velit dolor cillum irure voluptate ad incididunt consequat cillum esse laborum consequat do.\r\n", "registered": "Wednesday, August 27, 2014 6:55 AM", "latitude": 23.135493, "longitude": -133.213153, "tags": [ "ut", "ex", "deserunt", "mollit", "cillum", "aliquip", "excepteur" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Latisha Ortiz" }, { "id": 1, "name": "Ila Marshall" }, { "id": 2, "name": "Kathie Strong" } ], "greeting": "Hello, Marci! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa82113ff45aaf64d6b75", "index": 23, "guid": "a074b7d2-92de-4728-9032-ac711cc8ca1b", "isActive": true, "balance": "$1,927.67", "picture": "http://placehold.it/32x32", "age": 26, "eyeColor": "green", "name": { "first": "Lorie", "last": "Haynes" }, "company": "CUBIX", "email": "lorie.haynes@cubix.io", "phone": "+1 (914) 479-2574", "address": "209 Stoddard Place, Grahamtown, New Hampshire, 3422", "about": "Commodo eu reprehenderit aute veniam occaecat eiusmod ex enim mollit elit. Officia fugiat proident cillum sint sint. In anim occaecat in dolore pariatur occaecat dolore eu duis sint veniam labore tempor id.\r\n", "registered": "Thursday, June 19, 2014 3:03 AM", "latitude": -80.694066, "longitude": 98.315178, "tags": [ "proident", "est", "nulla", "minim", "aute", "duis", "ea" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Shana Jensen" }, { "id": 1, "name": "Audra Hays" }, { "id": 2, "name": "Shannon Stewart" } ], "greeting": "Hello, Lorie! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8216788a07fe633c5a6", "index": 24, "guid": "ff361134-2ce3-4cce-b043-d571e87a041d", "isActive": false, "balance": "$1,274.62", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "green", "name": { "first": "Parker", "last": "Higgins" }, "company": "ISOSTREAM", "email": "parker.higgins@isostream.net", "phone": "+1 (965) 467-3975", "address": "908 Division Place, Homeland, South Carolina, 2577", "about": "Laborum minim consectetur ipsum incididunt cupidatat ex ad labore eu non est consequat. Tempor eiusmod commodo Lorem enim aliquip ad non sint ipsum culpa amet. Eu sit amet velit est sit cupidatat aliquip magna proident id veniam Lorem dolore. Eiusmod ex amet proident enim ipsum proident mollit adipisicing ut.\r\n", "registered": "Monday, August 25, 2014 4:51 AM", "latitude": -28.784274, "longitude": -151.224185, "tags": [ "ea", "cupidatat", "do", "culpa", "ea", "ullamco", "nulla" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bridgette Tyler" }, { "id": 1, "name": "Harris Pollard" }, { "id": 2, "name": "Davenport Skinner" } ], "greeting": "Hello, Parker! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821ff898d23056717a4", "index": 25, "guid": "f5e85a0d-f46e-427e-86a7-657eaaadb169", "isActive": true, "balance": "$3,413.58", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "brown", "name": { "first": "Rios", "last": "Reilly" }, "company": "QUILTIGEN", "email": "rios.reilly@quiltigen.com", "phone": "+1 (982) 565-3930", "address": "789 Beekman Place, Wiscon, Texas, 8745", "about": "Consectetur qui do sint deserunt voluptate sunt dolor in officia aliquip. Eu irure sit veniam nostrud culpa laboris. Commodo nostrud cillum nulla nostrud.\r\n", "registered": "Thursday, September 4, 2014 1:54 PM", "latitude": 6.093115, "longitude": 145.037939, "tags": [ "eu", "consectetur", "veniam", "pariatur", "laboris", "ad", "cupidatat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Sweet Conley" }, { "id": 1, "name": "Key Grant" }, { "id": 2, "name": "Guthrie Moss" } ], "greeting": "Hello, Rios! You have 10 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82125f7c765fcbb1743", "index": 26, "guid": "e5f12323-5c7c-4103-b20c-1a633845a28c", "isActive": true, "balance": "$1,645.61", "picture": "http://placehold.it/32x32", "age": 26, "eyeColor": "green", "name": { "first": "Hurley", "last": "Cooke" }, "company": "QUORDATE", "email": "hurley.cooke@quordate.biz", "phone": "+1 (841) 404-3894", "address": "369 Denton Place, Curtice, South Dakota, 2613", "about": "Nulla non in aliqua sit mollit pariatur do mollit. Ut pariatur ut velit minim. Fugiat deserunt velit duis consequat labore culpa voluptate sint voluptate consectetur officia voluptate et laborum. Et exercitation ut eu pariatur minim velit elit. Dolore amet officia ipsum voluptate occaecat eiusmod cupidatat do dolore consequat esse consectetur aliquip.\r\n", "registered": "Sunday, April 13, 2014 11:42 AM", "latitude": -78.463811, "longitude": 36.580914, "tags": [ "deserunt", "nisi", "do", "enim", "nisi", "qui", "ipsum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Harvey Norman" }, { "id": 1, "name": "Porter Shannon" }, { "id": 2, "name": "Reyes Goodman" } ], "greeting": "Hello, Hurley! You have 10 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821f375b9cabd418303", "index": 27, "guid": "452fe001-7fff-4f69-9336-00e3e80e9792", "isActive": true, "balance": "$2,608.67", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "green", "name": { "first": "Jill", "last": "Blair" }, "company": "ORBALIX", "email": "jill.blair@orbalix.co.uk", "phone": "+1 (863) 519-2778", "address": "680 Cleveland Street, Kohatk, Ohio, 1688", "about": "Do labore sint cupidatat dolor. Mollit nulla voluptate nostrud tempor ad cillum in mollit officia reprehenderit duis commodo veniam ad. Adipisicing enim adipisicing consequat sint minim ut. Cupidatat non ullamco sunt mollit proident. Aliquip dolore dolor excepteur cupidatat. Consectetur duis adipisicing qui enim aute quis veniam deserunt occaecat. Duis elit exercitation ullamco voluptate aliqua.\r\n", "registered": "Tuesday, September 30, 2014 11:23 PM", "latitude": -33.279869, "longitude": 6.221211, "tags": [ "nostrud", "elit", "adipisicing", "esse", "in", "commodo", "ea" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tania Flores" }, { "id": 1, "name": "Nina Blackburn" }, { "id": 2, "name": "Mathews Fischer" } ], "greeting": "Hello, Jill! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821304372a99199671f", "index": 28, "guid": "d160ded3-911c-4ce2-a314-9ed9a8e6fa9b", "isActive": true, "balance": "$3,005.54", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "brown", "name": { "first": "Estela", "last": "Dalton" }, "company": "POWERNET", "email": "estela.dalton@powernet.tv", "phone": "+1 (959) 527-2607", "address": "820 Montauk Avenue, Whitmer, Maine, 3867", "about": "Commodo est ullamco sit eu irure tempor veniam deserunt in aute cillum tempor. Occaecat velit et deserunt incididunt sint do eu consectetur enim ullamco consectetur esse ipsum pariatur. Tempor exercitation dolore tempor enim. Dolor esse est magna occaecat. Elit culpa sint non ea exercitation. Aliquip nostrud aliquip culpa Lorem cillum incididunt do sit sunt velit id. Proident sit proident est velit consequat cillum officia in et.\r\n", "registered": "Sunday, April 13, 2014 5:53 AM", "latitude": 32.713335, "longitude": 174.505048, "tags": [ "aliquip", "dolore", "proident", "pariatur", "elit", "cillum", "id" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Gibson Durham" }, { "id": 1, "name": "Carolina Cooley" }, { "id": 2, "name": "Rosa Mcintyre" } ], "greeting": "Hello, Estela! You have 8 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82187c6143c96c5ce1f", "index": 29, "guid": "f62ae8de-8905-4ac0-9b5c-ce12dad96a86", "isActive": false, "balance": "$1,859.49", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "brown", "name": { "first": "Martina", "last": "Jacobson" }, "company": "CUIZINE", "email": "martina.jacobson@cuizine.name", "phone": "+1 (927) 493-2997", "address": "234 Utica Avenue, Hinsdale, Vermont, 459", "about": "Pariatur nulla ad sint tempor qui in id aliqua ex et ut. Qui occaecat quis veniam mollit officia duis ad ea. Est consectetur sit sint proident sit do. Id ut incididunt tempor id irure. Qui commodo cillum labore anim eiusmod exercitation ea qui nulla qui amet.\r\n", "registered": "Sunday, February 9, 2014 3:54 AM", "latitude": -36.70558, "longitude": -140.397297, "tags": [ "voluptate", "adipisicing", "do", "deserunt", "aliquip", "est", "minim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Griffith Martinez" }, { "id": 1, "name": "Richard Chavez" }, { "id": 2, "name": "Mckinney Butler" } ], "greeting": "Hello, Martina! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821392ebf56130b6eaa", "index": 30, "guid": "91c5f9c9-d3c7-435a-98cc-06e360c12e1d", "isActive": true, "balance": "$3,693.79", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "brown", "name": { "first": "Althea", "last": "Valencia" }, "company": "BLANET", "email": "althea.valencia@blanet.me", "phone": "+1 (887) 501-3212", "address": "911 Adams Street, Brambleton, Delaware, 5831", "about": "Quis culpa exercitation dolor anim. Id labore ea aute aliqua. Dolor dolore sit duis anim cillum nostrud officia dolor sit. Laborum tempor dolore id consequat.\r\n", "registered": "Saturday, January 11, 2014 6:27 PM", "latitude": -39.101471, "longitude": -22.991091, "tags": [ "eu", "anim", "elit", "pariatur", "cupidatat", "cupidatat", "enim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Dawson Foreman" }, { "id": 1, "name": "Sanford Meyer" }, { "id": 2, "name": "Ruth Barron" } ], "greeting": "Hello, Althea! You have 8 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82111b129b44454e349", "index": 31, "guid": "184ea3dd-af3f-400a-aa64-429b6cac091f", "isActive": true, "balance": "$1,351.78", "picture": "http://placehold.it/32x32", "age": 20, "eyeColor": "blue", "name": { "first": "Morrison", "last": "Chan" }, "company": "TALKALOT", "email": "morrison.chan@talkalot.us", "phone": "+1 (822) 448-3384", "address": "599 Olive Street, Franklin, Palau, 3303", "about": "Ex deserunt nulla velit dolore. Sunt sit ea irure incididunt aute sint do veniam. Sit ut ad ipsum est velit ea duis exercitation aliquip consectetur Lorem fugiat eu.\r\n", "registered": "Sunday, February 16, 2014 2:04 PM", "latitude": 61.099205, "longitude": -37.736061, "tags": [ "eu", "deserunt", "pariatur", "labore", "reprehenderit", "magna", "consectetur" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Norma Montoya" }, { "id": 1, "name": "Bailey Gillespie" }, { "id": 2, "name": "Candace Kent" } ], "greeting": "Hello, Morrison! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821aec56cb0ce50b54b", "index": 32, "guid": "b211ab76-8674-4ed0-9a40-2087930468ad", "isActive": false, "balance": "$1,492.99", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "green", "name": { "first": "Walters", "last": "Potts" }, "company": "FLUMBO", "email": "walters.potts@flumbo.ca", "phone": "+1 (871) 461-3958", "address": "438 Highland Avenue, Elwood, Arizona, 9669", "about": "Lorem do Lorem aliquip ipsum. Elit labore reprehenderit tempor do. Incididunt labore ad eu occaecat enim laborum irure elit nulla Lorem anim sit exercitation velit. Proident ullamco voluptate aute ex et aute mollit nostrud. Adipisicing labore sit irure amet dolore nostrud. Tempor nulla aliqua culpa commodo aliqua ut esse velit mollit ad. Aliqua nulla enim non nisi laboris sint aute duis proident qui officia.\r\n", "registered": "Saturday, September 6, 2014 11:47 AM", "latitude": 64.732922, "longitude": -168.513014, "tags": [ "tempor", "amet", "dolore", "proident", "reprehenderit", "non", "tempor" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Freida Bailey" }, { "id": 1, "name": "Bernice Curry" }, { "id": 2, "name": "Ochoa Jefferson" } ], "greeting": "Hello, Walters! You have 6 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82137be18ee6b852a45", "index": 33, "guid": "e8c67cca-c977-4668-9aff-46bfde1cd3de", "isActive": true, "balance": "$3,747.65", "picture": "http://placehold.it/32x32", "age": 24, "eyeColor": "blue", "name": { "first": "Meredith", "last": "Santana" }, "company": "GADTRON", "email": "meredith.santana@gadtron.org", "phone": "+1 (836) 438-3637", "address": "999 Centre Street, Chaparrito, Colorado, 4540", "about": "Magna nisi laboris sit quis duis anim et ullamco nostrud exercitation. Tempor enim nisi non culpa sit ex elit labore proident veniam dolore anim ex. Nostrud est qui do magna proident et. Nulla ea laboris incididunt elit labore id mollit reprehenderit. Amet in Lorem exercitation tempor voluptate labore anim adipisicing labore in dolor proident labore. Lorem labore duis ex Lorem nulla. Veniam in fugiat ex ullamco officia elit eiusmod enim.\r\n", "registered": "Sunday, March 2, 2014 1:38 PM", "latitude": 80.220732, "longitude": 79.102966, "tags": [ "culpa", "esse", "velit", "consectetur", "incididunt", "dolore", "aliqua" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bernadine Manning" }, { "id": 1, "name": "Daphne Wyatt" }, { "id": 2, "name": "Keri Harrison" } ], "greeting": "Hello, Meredith! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821ecdd700bb0b77dc2", "index": 34, "guid": "b93f3a6f-f05b-4d7e-93b8-4502d9c76cd2", "isActive": true, "balance": "$3,059.56", "picture": "http://placehold.it/32x32", "age": 25, "eyeColor": "brown", "name": { "first": "Samantha", "last": "Finley" }, "company": "XYQAG", "email": "samantha.finley@xyqag.biz", "phone": "+1 (879) 568-2419", "address": "349 Truxton Street, Haring, Missouri, 8383", "about": "Consequat do id et quis eiusmod eu irure sunt qui. Mollit minim nulla magna duis nostrud cillum ullamco sunt adipisicing elit ex. Minim fugiat deserunt nostrud esse laboris ullamco sit sit magna. Tempor occaecat Lorem qui ad ut tempor excepteur. Et sunt ullamco officia et Lorem est. Ipsum dolor ut ut elit do nisi in aute consequat. Enim esse ex aliqua anim aliquip cupidatat do Lorem voluptate quis ea culpa incididunt reprehenderit.\r\n", "registered": "Saturday, March 29, 2014 1:38 PM", "latitude": 79.209401, "longitude": -139.211605, "tags": [ "irure", "eiusmod", "nulla", "officia", "eu", "elit", "nisi" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mayer Justice" }, { "id": 1, "name": "Mae Hancock" }, { "id": 2, "name": "Sherri Bradshaw" } ], "greeting": "Hello, Samantha! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8218ac5365ad300d1bd", "index": 35, "guid": "f3b50cb9-da35-47fe-b0fa-fec9fc84cf8e", "isActive": false, "balance": "$2,819.28", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "blue", "name": { "first": "Cohen", "last": "Finch" }, "company": "SYNTAC", "email": "cohen.finch@syntac.io", "phone": "+1 (950) 459-2729", "address": "436 Pineapple Street, Deercroft, Minnesota, 3218", "about": "Sint velit officia quis esse. Nulla aute laborum veniam dolore tempor adipisicing proident. Duis irure esse nostrud veniam est mollit mollit voluptate eiusmod anim veniam eiusmod. Ullamco sunt sit sint minim ea reprehenderit qui consequat ipsum. Sint id voluptate reprehenderit irure nulla veniam eu Lorem enim nulla. Cupidatat amet pariatur dolor amet ex nostrud dolor ipsum tempor enim nulla aliquip tempor Lorem.\r\n", "registered": "Wednesday, October 8, 2014 10:04 PM", "latitude": -84.299718, "longitude": 52.573184, "tags": [ "deserunt", "eu", "consectetur", "ea", "non", "officia", "reprehenderit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Stevenson Mcintosh" }, { "id": 1, "name": "Chrystal Oneill" }, { "id": 2, "name": "Janine Rowe" } ], "greeting": "Hello, Cohen! You have 10 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82161d5c66d4bd0996e", "index": 36, "guid": "6dfc2232-f3c6-4818-956a-e8c683fd69fe", "isActive": true, "balance": "$3,262.20", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "blue", "name": { "first": "Joy", "last": "Moran" }, "company": "UPDAT", "email": "joy.moran@updat.net", "phone": "+1 (968) 581-3365", "address": "279 Kosciusko Street, Smock, Northern Mariana Islands, 5007", "about": "Quis elit pariatur eu enim magna magna sunt dolore duis commodo. Pariatur sint duis ex aute eu est deserunt culpa fugiat minim non. Tempor consequat consectetur consequat sit incididunt officia id. Incididunt ex eiusmod excepteur aute mollit veniam quis excepteur occaecat excepteur deserunt reprehenderit. Est sit laboris eu dolor. Sunt voluptate quis aliquip nulla ex irure velit in. Aliqua sit id eiusmod amet commodo pariatur deserunt voluptate qui minim ex incididunt voluptate.\r\n", "registered": "Saturday, February 8, 2014 9:55 PM", "latitude": 53.735731, "longitude": 46.00211, "tags": [ "exercitation", "dolor", "minim", "incididunt", "laborum", "qui", "sit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Joyce Mckay" }, { "id": 1, "name": "Turner Murray" }, { "id": 2, "name": "Jackson Jackson" } ], "greeting": "Hello, Joy! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821a9817ca1a9be6517", "index": 37, "guid": "84fe8707-cfbc-4434-98bb-faf9cb97471a", "isActive": true, "balance": "$3,224.80", "picture": "http://placehold.it/32x32", "age": 27, "eyeColor": "blue", "name": { "first": "Brennan", "last": "Stafford" }, "company": "LOVEPAD", "email": "brennan.stafford@lovepad.com", "phone": "+1 (873) 405-3600", "address": "471 Ryder Avenue, Succasunna, Marshall Islands, 2595", "about": "Et officia quis magna laborum et proident labore elit do Lorem reprehenderit irure. Laborum culpa culpa voluptate commodo consequat non et amet. Mollit cupidatat irure magna sint commodo ipsum proident tempor est. Laboris exercitation aliqua aute deserunt do in aliqua minim ex excepteur. Consequat in minim officia labore laboris laboris occaecat occaecat. Ex qui aliquip sint consectetur elit excepteur incididunt eu non laborum do eu excepteur.\r\n", "registered": "Saturday, May 31, 2014 3:28 PM", "latitude": -69.429728, "longitude": 46.837644, "tags": [ "proident", "ad", "non", "duis", "occaecat", "proident", "non" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Jones Kirk" }, { "id": 1, "name": "Howe Drake" }, { "id": 2, "name": "Kimberly Jennings" } ], "greeting": "Hello, Brennan! You have 6 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa8219251dc49e1cb846a", "index": 38, "guid": "c260bce1-46ac-4e84-9490-13eb8202904e", "isActive": true, "balance": "$1,330.69", "picture": "http://placehold.it/32x32", "age": 27, "eyeColor": "brown", "name": { "first": "Neal", "last": "Mooney" }, "company": "SOFTMICRO", "email": "neal.mooney@softmicro.biz", "phone": "+1 (883) 463-3623", "address": "818 Lancaster Avenue, Chelsea, New Jersey, 3590", "about": "Reprehenderit anim nostrud adipisicing non minim ea. Elit deserunt id in mollit nisi. Pariatur in consequat irure aliqua laboris ipsum.\r\n", "registered": "Wednesday, May 21, 2014 4:33 PM", "latitude": -57.826881, "longitude": 154.840249, "tags": [ "consequat", "aliquip", "pariatur", "nulla", "dolore", "deserunt", "ipsum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Beach Roman" }, { "id": 1, "name": "Nash Young" }, { "id": 2, "name": "Carey Dale" } ], "greeting": "Hello, Neal! You have 10 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821cedc96e4f2209487", "index": 39, "guid": "ed7bbe27-811c-44e4-896e-cdf6ef62e048", "isActive": false, "balance": "$3,148.21", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "green", "name": { "first": "Roy", "last": "Becker" }, "company": "KONGENE", "email": "roy.becker@kongene.co.uk", "phone": "+1 (895) 426-2172", "address": "414 Seagate Avenue, Watrous, Virgin Islands, 3905", "about": "Commodo mollit do minim dolor magna occaecat labore Lorem eiusmod. Occaecat mollit occaecat ex anim est amet irure non minim. Tempor laborum cupidatat tempor ex Lorem cupidatat incididunt ullamco fugiat Lorem consequat labore Lorem non.\r\n", "registered": "Sunday, August 17, 2014 3:16 PM", "latitude": -2.609533, "longitude": -143.844769, "tags": [ "do", "culpa", "sint", "ea", "duis", "aliqua", "anim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lowery Hull" }, { "id": 1, "name": "Abbott Oneal" }, { "id": 2, "name": "Nellie Hammond" } ], "greeting": "Hello, Roy! You have 9 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821668031e7f50e30e9", "index": 40, "guid": "14dc3a87-0acf-4edd-93e4-ddcbeeecf96b", "isActive": false, "balance": "$2,617.16", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "brown", "name": { "first": "Courtney", "last": "Watson" }, "company": "ISOSWITCH", "email": "courtney.watson@isoswitch.tv", "phone": "+1 (882) 468-2163", "address": "385 Douglass Street, Iberia, Oregon, 7802", "about": "Culpa sunt amet eu magna id quis quis irure velit. Culpa nostrud do enim proident officia. Laboris laborum laborum esse irure proident laborum amet sunt ipsum dolor nulla non ipsum sint. Amet deserunt in esse aliquip laboris proident fugiat nisi cillum ullamco occaecat est. Reprehenderit laborum enim labore ex. Velit do adipisicing irure dolor pariatur duis magna velit. Laborum sint laborum eu anim aliquip adipisicing labore.\r\n", "registered": "Tuesday, July 22, 2014 6:03 PM", "latitude": -75.831312, "longitude": -172.468604, "tags": [ "dolor", "velit", "et", "id", "cupidatat", "exercitation", "laborum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mccray Gomez" }, { "id": 1, "name": "Hoover Rasmussen" }, { "id": 2, "name": "Hillary Castillo" } ], "greeting": "Hello, Courtney! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8213c480453670f0428", "index": 41, "guid": "e7b97ea6-a13f-42ab-a998-e48614000aca", "isActive": true, "balance": "$1,499.72", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "blue", "name": { "first": "Dale", "last": "Love" }, "company": "BULLJUICE", "email": "dale.love@bulljuice.name", "phone": "+1 (933) 588-3310", "address": "603 Myrtle Avenue, Allentown, Utah, 793", "about": "Ad quis anim commodo nulla et anim minim commodo irure excepteur. Pariatur ut anim aliquip id ex ipsum exercitation irure qui in nisi quis. Cillum deserunt duis dolore quis nostrud incididunt ipsum ea ipsum id fugiat eu voluptate nisi. Exercitation laborum fugiat irure anim. Ex nostrud aliqua deserunt amet.\r\n", "registered": "Tuesday, July 22, 2014 1:19 PM", "latitude": 55.335017, "longitude": 101.730023, "tags": [ "ea", "non", "fugiat", "Lorem", "tempor", "ut", "do" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Spears Diaz" }, { "id": 1, "name": "Nora Dominguez" }, { "id": 2, "name": "Tamra Paul" } ], "greeting": "Hello, Dale! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821c82bf70ca08206a9", "index": 42, "guid": "4367142d-e2b7-475c-b430-ac617295fbfc", "isActive": false, "balance": "$2,698.29", "picture": "http://placehold.it/32x32", "age": 37, "eyeColor": "blue", "name": { "first": "Gibbs", "last": "Hunt" }, "company": "COWTOWN", "email": "gibbs.hunt@cowtown.me", "phone": "+1 (960) 424-3404", "address": "758 Suydam Place, Adamstown, North Carolina, 2800", "about": "Veniam qui incididunt officia amet commodo nostrud. Magna consectetur consectetur officia Lorem amet sit officia excepteur minim consectetur pariatur dolore. Mollit fugiat aliqua consectetur qui non elit in aliquip culpa Lorem consectetur velit ad.\r\n", "registered": "Monday, February 10, 2014 4:10 PM", "latitude": 62.263652, "longitude": 64.978136, "tags": [ "et", "dolor", "aute", "minim", "sunt", "veniam", "do" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Henry Schmidt" }, { "id": 1, "name": "Herman Wynn" }, { "id": 2, "name": "Wilda Grimes" } ], "greeting": "Hello, Gibbs! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8210b1096c8a2f821c4", "index": 43, "guid": "5184508c-47f7-48b5-85ac-d15ed747ed07", "isActive": true, "balance": "$3,460.45", "picture": "http://placehold.it/32x32", "age": 30, "eyeColor": "green", "name": { "first": "Francis", "last": "Barton" }, "company": "COMTRAIL", "email": "francis.barton@comtrail.us", "phone": "+1 (881) 419-2936", "address": "562 Ferris Street, Ola, Maryland, 3838", "about": "Duis minim laboris in reprehenderit id ut laborum esse consequat. In dolore sunt consequat non fugiat do duis duis. Officia ipsum eiusmod laboris do aliqua aute velit minim nulla nisi. Dolor incididunt enim est eu cupidatat. Dolor commodo sit consectetur irure aliqua ea enim esse reprehenderit ullamco.\r\n", "registered": "Thursday, April 10, 2014 2:48 PM", "latitude": -35.457713, "longitude": 141.805123, "tags": [ "tempor", "officia", "quis", "tempor", "ex", "mollit", "amet" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mayra Walters" }, { "id": 1, "name": "Casey Gross" }, { "id": 2, "name": "Aisha Santos" } ], "greeting": "Hello, Francis! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821890ad48b2eaabcfb", "index": 44, "guid": "07497907-7e6f-471d-af9d-1dcbcf056a56", "isActive": true, "balance": "$2,166.79", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "blue", "name": { "first": "Dina", "last": "Travis" }, "company": "VENOFLEX", "email": "dina.travis@venoflex.ca", "phone": "+1 (921) 485-3865", "address": "366 Tillary Street, Century, New York, 6335", "about": "Dolor sunt culpa enim sint officia sint id do ut anim ex in. Dolore est irure aliquip nulla laborum aliqua tempor id ea mollit in ad deserunt. Qui ullamco duis qui elit excepteur. Aute proident duis veniam enim commodo non minim id. Consequat anim eiusmod consectetur ut et labore officia ex ad cillum occaecat. Sit irure officia veniam sint et consequat reprehenderit officia qui. Aute esse nulla ad quis reprehenderit duis.\r\n", "registered": "Friday, September 12, 2014 5:53 AM", "latitude": 24.764352, "longitude": 148.493552, "tags": [ "qui", "officia", "dolor", "velit", "ex", "veniam", "ullamco" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Sharpe Foster" }, { "id": 1, "name": "Kathrine Ayers" }, { "id": 2, "name": "Cox Acosta" } ], "greeting": "Hello, Dina! You have 8 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa82101996fc944f7f215", "index": 45, "guid": "46b331f8-78d3-403f-8c93-cbaac9438998", "isActive": false, "balance": "$2,193.84", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "blue", "name": { "first": "Haney", "last": "Garrett" }, "company": "EZENTIA", "email": "haney.garrett@ezentia.org", "phone": "+1 (965) 596-2629", "address": "162 Village Road, Southmont, Virginia, 6673", "about": "Laboris do veniam exercitation officia id eu minim irure Lorem laborum. Sint magna aliquip ad elit eiusmod cillum laborum. Adipisicing aliquip nulla mollit ipsum cupidatat nisi duis irure ullamco. Et elit nulla nisi culpa mollit esse in. Dolore non nulla anim magna enim aliquip quis amet non tempor incididunt dolor.\r\n", "registered": "Monday, August 18, 2014 3:42 PM", "latitude": 6.549909, "longitude": 32.226887, "tags": [ "laboris", "duis", "culpa", "qui", "dolor", "esse", "reprehenderit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mariana Sharp" }, { "id": 1, "name": "Sue Baldwin" }, { "id": 2, "name": "Ross Arnold" } ], "greeting": "Hello, Haney! You have 10 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821453cc33bd1abd21d", "index": 46, "guid": "313f0c45-6eaf-46d9-a28d-ca31e79d2c1c", "isActive": false, "balance": "$2,303.36", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "blue", "name": { "first": "Gale", "last": "Robles" }, "company": "NEWCUBE", "email": "gale.robles@newcube.biz", "phone": "+1 (996) 558-2811", "address": "597 Java Street, Sanborn, North Dakota, 1789", "about": "Anim fugiat do nisi dolor sunt consequat irure quis laborum. Nisi cupidatat dolore excepteur irure ea minim proident excepteur exercitation ut voluptate deserunt. Ad do amet id voluptate enim commodo ex. Sunt sint quis sint aute do ea aliqua. Enim ullamco dolore proident qui mollit irure consequat. Nostrud sunt adipisicing elit incididunt do laboris ad officia ea amet id reprehenderit nulla.\r\n", "registered": "Tuesday, July 15, 2014 2:25 PM", "latitude": -21.549196, "longitude": -97.373962, "tags": [ "ullamco", "amet", "sint", "elit", "tempor", "ex", "pariatur" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bell Gould" }, { "id": 1, "name": "Denise Kirby" }, { "id": 2, "name": "Hess Hinton" } ], "greeting": "Hello, Gale! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821ed643a410e2d79dc", "index": 47, "guid": "2620cb2b-df00-4303-a5ff-768ffb1697c5", "isActive": true, "balance": "$2,890.73", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "blue", "name": { "first": "Alisha", "last": "Hamilton" }, "company": "FITCORE", "email": "alisha.hamilton@fitcore.io", "phone": "+1 (853) 468-3192", "address": "257 Bayard Street, Coldiron, Oklahoma, 9228", "about": "Sunt nostrud sunt magna amet excepteur est tempor veniam aliqua. Laboris id aliquip fugiat exercitation dolore veniam et anim duis sit esse ex elit ullamco. Lorem commodo exercitation in sit cillum ipsum do dolor.\r\n", "registered": "Tuesday, March 11, 2014 12:29 PM", "latitude": 85.840017, "longitude": -57.093095, "tags": [ "consectetur", "commodo", "est", "ut", "incididunt", "elit", "ipsum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Steele Ellis" }, { "id": 1, "name": "Serena Emerson" }, { "id": 2, "name": "Betty Langley" } ], "greeting": "Hello, Alisha! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8215c6db03112e3e13d", "index": 48, "guid": "28b59ead-0fd8-480b-8eb8-2d75290934f6", "isActive": false, "balance": "$3,497.68", "picture": "http://placehold.it/32x32", "age": 25, "eyeColor": "blue", "name": { "first": "Kaufman", "last": "Williams" }, "company": "COMBOGENE", "email": "kaufman.williams@combogene.net", "phone": "+1 (820) 465-3213", "address": "353 Clarendon Road, Wilmington, Michigan, 3811", "about": "Irure id sint elit mollit occaecat occaecat veniam elit reprehenderit esse officia cillum. Aute aute occaecat ipsum commodo laborum adipisicing fugiat aliquip dolore. Deserunt id excepteur enim eu adipisicing nulla ut non est dolore est. Culpa magna et sit et non ex.\r\n", "registered": "Sunday, September 7, 2014 5:57 AM", "latitude": 10.667631, "longitude": 157.707911, "tags": [ "consequat", "dolor", "deserunt", "amet", "Lorem", "aliqua", "minim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Horn Franco" }, { "id": 1, "name": "Kathleen Hickman" }, { "id": 2, "name": "Rosario Scott" } ], "greeting": "Hello, Kaufman! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821045c82593b79538d", "index": 49, "guid": "cef964ed-4208-41eb-a8d8-916d95d18f8a", "isActive": true, "balance": "$3,808.37", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "blue", "name": { "first": "Tran", "last": "Gallegos" }, "company": "CONCILITY", "email": "tran.gallegos@concility.com", "phone": "+1 (925) 487-2143", "address": "969 Schermerhorn Street, Watchtower, Idaho, 413", "about": "Velit ut enim cupidatat adipisicing culpa in non incididunt exercitation dolor pariatur. Deserunt dolor occaecat dolor officia ipsum occaecat tempor nisi. Culpa et culpa aute incididunt et labore sunt cillum nulla. Reprehenderit culpa enim laborum nostrud consectetur velit nulla consequat aliqua non exercitation sunt nulla aliqua. Labore incididunt aliqua aliqua anim duis culpa elit labore. Aliqua ipsum mollit ut sint aliquip in aute do qui amet.\r\n", "registered": "Friday, May 9, 2014 9:24 AM", "latitude": -49.148583, "longitude": 4.911715, "tags": [ "labore", "duis", "proident", "adipisicing", "nisi", "tempor", "nisi" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Nicole Holloway" }, { "id": 1, "name": "Minerva Beasley" }, { "id": 2, "name": "Bowers Suarez" } ], "greeting": "Hello, Tran! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821fbd8e9836595f96d", "index": 50, "guid": "966b2f5e-5686-4381-9ab7-87bc9ac9968b", "isActive": true, "balance": "$1,351.67", "picture": "http://placehold.it/32x32", "age": 23, "eyeColor": "green", "name": { "first": "Mable", "last": "Lambert" }, "company": "ZENSUS", "email": "mable.lambert@zensus.biz", "phone": "+1 (917) 404-3441", "address": "174 Concord Street, Somerset, Nebraska, 7318", "about": "Ad minim esse ipsum incididunt incididunt enim Lorem nulla excepteur velit fugiat ullamco amet reprehenderit. Labore velit fugiat proident enim Lorem mollit ex. Tempor voluptate cupidatat officia nostrud qui. Veniam duis voluptate deserunt commodo consectetur eiusmod qui excepteur aliquip. Exercitation laborum Lorem excepteur ipsum aliqua fugiat reprehenderit ea dolore deserunt commodo cillum ipsum eu. Ullamco quis voluptate eiusmod ea aute et pariatur consequat duis occaecat nulla aliquip.\r\n", "registered": "Sunday, May 25, 2014 4:54 PM", "latitude": 79.811908, "longitude": -62.629133, "tags": [ "sit", "non", "reprehenderit", "exercitation", "dolor", "labore", "irure" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Rosie Gill" }, { "id": 1, "name": "Parrish Dean" }, { "id": 2, "name": "Annmarie Delacruz" } ], "greeting": "Hello, Mable! You have 10 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821c85822cf149b785f", "index": 51, "guid": "1afd0e8f-b518-4bca-a4df-29e9b6a961d6", "isActive": true, "balance": "$2,628.22", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "brown", "name": { "first": "Sadie", "last": "Clarke" }, "company": "UNISURE", "email": "sadie.clarke@unisure.co.uk", "phone": "+1 (905) 480-2930", "address": "326 Gilmore Court, Hamilton, Montana, 9217", "about": "Dolore do nisi reprehenderit consectetur in. In esse sit proident enim duis veniam quis laboris nulla cillum adipisicing veniam aute. Culpa sunt ex exercitation sit esse exercitation dolor ea enim ad est aute consequat qui. Esse esse nulla eiusmod eiusmod ullamco esse cillum aute ea id ex quis. Pariatur officia Lorem aute officia anim velit velit elit sint voluptate. Aliquip ad velit velit laboris et culpa. Do consectetur aliqua sit sunt eu anim culpa ut incididunt et.\r\n", "registered": "Sunday, April 27, 2014 10:37 AM", "latitude": -71.828101, "longitude": -138.908359, "tags": [ "nostrud", "amet", "minim", "occaecat", "proident", "sint", "nostrud" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Christa Estes" }, { "id": 1, "name": "Alana Schneider" }, { "id": 2, "name": "Frank Spears" } ], "greeting": "Hello, Sadie! You have 6 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821aa6b44e8d20db81c", "index": 52, "guid": "e0220e02-565c-424a-8834-f955ccb72f7d", "isActive": false, "balance": "$2,918.63", "picture": "http://placehold.it/32x32", "age": 30, "eyeColor": "brown", "name": { "first": "Deana", "last": "Fletcher" }, "company": "VISALIA", "email": "deana.fletcher@visalia.tv", "phone": "+1 (815) 430-2641", "address": "347 Tehama Street, Hollins, Washington, 5953", "about": "Est consequat id ad Lorem consequat quis ullamco minim pariatur ipsum cillum. Enim exercitation qui duis cillum ea amet ea sint proident officia dolor non. Irure culpa cillum minim officia est culpa sit.\r\n", "registered": "Monday, May 5, 2014 1:51 AM", "latitude": 51.516197, "longitude": 80.400628, "tags": [ "ut", "tempor", "pariatur", "ex", "dolore", "deserunt", "culpa" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Hansen Estrada" }, { "id": 1, "name": "Regina Munoz" }, { "id": 2, "name": "Bethany Cabrera" } ], "greeting": "Hello, Deana! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa82120c61930bc25e2ff", "index": 53, "guid": "99c62c99-ef16-4eb7-a41d-80feafca740a", "isActive": false, "balance": "$1,836.96", "picture": "http://placehold.it/32x32", "age": 27, "eyeColor": "brown", "name": { "first": "Long", "last": "Sandoval" }, "company": "GINKLE", "email": "long.sandoval@ginkle.name", "phone": "+1 (989) 541-2327", "address": "161 Crown Street, Omar, Kentucky, 8615", "about": "Et ea eiusmod ex consequat culpa proident. Reprehenderit proident ullamco ullamco aliquip incididunt ullamco sit proident dolore nulla fugiat sit laboris. Adipisicing ullamco laborum nulla exercitation reprehenderit irure ex.\r\n", "registered": "Tuesday, July 29, 2014 12:14 AM", "latitude": -20.766582, "longitude": 74.616145, "tags": [ "et", "consequat", "duis", "excepteur", "sint", "sunt", "aliqua" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Aline Rosa" }, { "id": 1, "name": "Olivia Quinn" }, { "id": 2, "name": "Fowler Carter" } ], "greeting": "Hello, Long! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821cc7ceb7da88472ed", "index": 54, "guid": "3a965f51-48f9-4d10-8a9b-a0b529749c93", "isActive": true, "balance": "$2,950.94", "picture": "http://placehold.it/32x32", "age": 25, "eyeColor": "green", "name": { "first": "Rush", "last": "Thornton" }, "company": "AQUASSEUR", "email": "rush.thornton@aquasseur.me", "phone": "+1 (916) 493-2777", "address": "344 Sunnyside Avenue, Brethren, California, 9529", "about": "Duis ut consequat eu laborum voluptate eu Lorem cillum ad in commodo adipisicing. Excepteur aliquip sint dolor voluptate cillum nisi mollit mollit laborum ex culpa adipisicing voluptate. Cupidatat do sit fugiat amet irure. Cupidatat ex ut commodo reprehenderit veniam sit est officia ad pariatur aliquip.\r\n", "registered": "Thursday, September 25, 2014 11:09 AM", "latitude": -61.409359, "longitude": -87.414208, "tags": [ "adipisicing", "consequat", "magna", "Lorem", "consequat", "voluptate", "eu" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Hill Good" }, { "id": 1, "name": "Hartman Rice" }, { "id": 2, "name": "Petersen Hogan" } ], "greeting": "Hello, Rush! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821e221eb5b7ed845c0", "index": 55, "guid": "ab0f1517-8c25-46ff-a281-0dcc932e2f9a", "isActive": false, "balance": "$2,070.82", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "green", "name": { "first": "Alyce", "last": "Perez" }, "company": "CAPSCREEN", "email": "alyce.perez@capscreen.us", "phone": "+1 (955) 432-2025", "address": "896 Troutman Street, Williamson, West Virginia, 6491", "about": "In consequat quis ex sint nisi proident esse excepteur quis nostrud. Enim incididunt ullamco sint quis eiusmod qui tempor ad laboris eiusmod nulla in aliquip sit. Nostrud fugiat fugiat Lorem laboris pariatur eiusmod amet ea do irure et. Excepteur pariatur consequat exercitation amet occaecat do aliqua non deserunt nulla cupidatat tempor id. Mollit ex incididunt et nulla culpa mollit veniam qui amet in excepteur pariatur. Commodo reprehenderit tempor laborum nisi anim minim deserunt eiusmod adipisicing deserunt ut eiusmod excepteur.\r\n", "registered": "Monday, June 23, 2014 7:37 AM", "latitude": -4.180393, "longitude": 21.4789, "tags": [ "dolore", "officia", "laborum", "aliquip", "ex", "eu", "sint" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Rosalind Lang" }, { "id": 1, "name": "Ina Pratt" }, { "id": 2, "name": "Tamika Mercer" } ], "greeting": "Hello, Alyce! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8215e315c720e186460", "index": 56, "guid": "10727900-9be7-46d5-8f2c-7c6834d95a25", "isActive": false, "balance": "$1,907.19", "picture": "http://placehold.it/32x32", "age": 37, "eyeColor": "brown", "name": { "first": "Snider", "last": "Johnson" }, "company": "IPLAX", "email": "snider.johnson@iplax.ca", "phone": "+1 (883) 539-3127", "address": "424 Hancock Street, Springdale, Wyoming, 7054", "about": "Incididunt proident amet consectetur cupidatat ex officia labore cupidatat laborum. Tempor proident officia nisi Lorem. Lorem commodo commodo ea voluptate excepteur consequat anim quis excepteur sunt officia.\r\n", "registered": "Saturday, March 8, 2014 9:23 PM", "latitude": 16.66716, "longitude": 17.844641, "tags": [ "esse", "est", "eu", "dolor", "ea", "voluptate", "nostrud" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bauer Burt" }, { "id": 1, "name": "Lowe Boyd" }, { "id": 2, "name": "Moon Garcia" } ], "greeting": "Hello, Snider! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa82130f82b9ee9265e5f", "index": 57, "guid": "ba427ee5-5013-498f-a1a2-97a71b249a6e", "isActive": true, "balance": "$2,070.53", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "brown", "name": { "first": "Berry", "last": "Carver" }, "company": "EVENTIX", "email": "berry.carver@eventix.org", "phone": "+1 (907) 508-2463", "address": "415 Havens Place, Nile, Connecticut, 6089", "about": "Quis dolor aute consequat sunt esse dolore Lorem pariatur reprehenderit incididunt aliqua. Officia sunt aute fugiat consectetur id exercitation aliquip velit do fugiat culpa. Et ad amet exercitation veniam ipsum duis qui sunt incididunt. Eiusmod commodo esse aliquip exercitation pariatur consequat nulla nulla quis eiusmod dolor. Ut consectetur qui culpa id veniam dolore pariatur quis est cillum voluptate esse. Sunt eiusmod adipisicing mollit est tempor ipsum dolore tempor. Velit consequat dolore cillum adipisicing id nulla veniam nisi velit in magna id anim.\r\n", "registered": "Monday, January 13, 2014 10:45 PM", "latitude": -60.884888, "longitude": 139.360489, "tags": [ "eu", "deserunt", "minim", "quis", "eiusmod", "sint", "dolor" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tanisha Dudley" }, { "id": 1, "name": "Dale Mcgowan" }, { "id": 2, "name": "Torres Pennington" } ], "greeting": "Hello, Berry! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821bc354233d50ef914", "index": 58, "guid": "6ab626f8-6b71-4f17-ba39-4cc97fdf4855", "isActive": false, "balance": "$2,822.25", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "green", "name": { "first": "Kramer", "last": "Berg" }, "company": "INTRADISK", "email": "kramer.berg@intradisk.biz", "phone": "+1 (901) 534-3326", "address": "455 Bath Avenue, Hoagland, Guam, 2206", "about": "Labore ullamco aliquip id incididunt cupidatat pariatur. In magna et aliquip consectetur dolor ullamco aliqua reprehenderit. Ad velit nisi ex culpa consequat. Culpa eiusmod incididunt pariatur esse tempor officia mollit.\r\n", "registered": "Friday, June 13, 2014 8:45 AM", "latitude": -43.442578, "longitude": 69.627031, "tags": [ "exercitation", "dolor", "quis", "laboris", "exercitation", "sunt", "ipsum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Love Hutchinson" }, { "id": 1, "name": "Hayden Marquez" }, { "id": 2, "name": "Macdonald Hahn" } ], "greeting": "Hello, Kramer! You have 5 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821cf5d51b48b4bd07a", "index": 59, "guid": "7b339d1e-d759-4fed-9e58-fd2608cdb0f2", "isActive": false, "balance": "$3,836.86", "picture": "http://placehold.it/32x32", "age": 20, "eyeColor": "brown", "name": { "first": "Joann", "last": "Elliott" }, "company": "ATOMICA", "email": "joann.elliott@atomica.io", "phone": "+1 (992) 429-2667", "address": "788 Willow Place, Lindisfarne, Mississippi, 3656", "about": "Ut consequat sunt ipsum minim velit. Lorem eiusmod dolor voluptate est deserunt cupidatat ut ipsum. Et et irure Lorem laborum sint mollit pariatur elit et enim eu eu sunt. Nisi do quis proident enim irure dolore ut Lorem fugiat quis voluptate non reprehenderit dolore.\r\n", "registered": "Monday, May 12, 2014 6:04 PM", "latitude": 14.309335, "longitude": 32.596666, "tags": [ "nulla", "magna", "dolore", "incididunt", "fugiat", "elit", "veniam" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mason Hurst" }, { "id": 1, "name": "Castaneda Davidson" }, { "id": 2, "name": "Rasmussen Adkins" } ], "greeting": "Hello, Joann! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821876778d3d011eb7b", "index": 60, "guid": "a016ab64-b6dd-42bc-8b5f-dbbab7a01d2a", "isActive": true, "balance": "$2,795.00", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "green", "name": { "first": "Barbara", "last": "Nolan" }, "company": "FURNAFIX", "email": "barbara.nolan@furnafix.net", "phone": "+1 (892) 600-2820", "address": "540 Dennett Place, Mammoth, Rhode Island, 6151", "about": "In velit officia quis Lorem. Ex quis cillum esse deserunt consectetur et nulla tempor. Lorem reprehenderit cillum excepteur ea veniam commodo et ad ullamco. Ex elit nisi non ipsum aliqua laborum sint aliqua. Reprehenderit consectetur dolore occaecat irure incididunt sunt.\r\n", "registered": "Monday, April 21, 2014 11:59 AM", "latitude": 71.103088, "longitude": -78.48592, "tags": [ "eu", "ullamco", "cillum", "est", "commodo", "nisi", "tempor" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Cynthia Aguilar" }, { "id": 1, "name": "Deanna Graves" }, { "id": 2, "name": "Bertha Caldwell" } ], "greeting": "Hello, Barbara! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821d6e2aaf18a0b184f", "index": 61, "guid": "89ca6bc0-19c2-4d13-a37c-90d02005a6bc", "isActive": false, "balance": "$3,134.62", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "blue", "name": { "first": "Penelope", "last": "William" }, "company": "UTARA", "email": "penelope.william@utara.com", "phone": "+1 (968) 575-2395", "address": "276 Ralph Avenue, Ezel, New Mexico, 2656", "about": "Pariatur officia anim dolore commodo ipsum labore sint officia. Lorem culpa ea sunt non. Voluptate irure voluptate ut cupidatat nulla nostrud.\r\n", "registered": "Monday, July 7, 2014 11:29 PM", "latitude": -83.184502, "longitude": -91.222471, "tags": [ "anim", "incididunt", "aliqua", "id", "reprehenderit", "laboris", "consequat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Maxwell Rocha" }, { "id": 1, "name": "Roach Bryan" }, { "id": 2, "name": "Woods Daugherty" } ], "greeting": "Hello, Penelope! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8217abc85acd32fb42a", "index": 62, "guid": "cc58e868-7934-40a2-a350-13ad47e86a56", "isActive": true, "balance": "$3,734.05", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": { "first": "Kris", "last": "Cotton" }, "company": "CORPORANA", "email": "kris.cotton@corporana.biz", "phone": "+1 (873) 412-2513", "address": "650 Bushwick Court, Malott, Wisconsin, 9739", "about": "Aliquip cupidatat exercitation exercitation consectetur. Sit id excepteur ea ut laborum irure ullamco laborum irure reprehenderit nisi aute eu. Ipsum do anim ea veniam do amet pariatur. Lorem consectetur labore deserunt anim deserunt aute.\r\n", "registered": "Thursday, February 20, 2014 7:18 AM", "latitude": 41.787092, "longitude": -44.032192, "tags": [ "ex", "incididunt", "ut", "cupidatat", "commodo", "commodo", "occaecat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Angela Middleton" }, { "id": 1, "name": "Hicks Douglas" }, { "id": 2, "name": "Shaffer West" } ], "greeting": "Hello, Kris! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821c20dda84da819450", "index": 63, "guid": "6ecab19a-0268-4d43-ad43-af2e4941b2e7", "isActive": false, "balance": "$2,748.00", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": { "first": "William", "last": "Haney" }, "company": "PROSURE", "email": "william.haney@prosure.co.uk", "phone": "+1 (890) 508-3193", "address": "930 Hopkins Street, Bluetown, American Samoa, 9860", "about": "Ad aute aliquip eiusmod tempor ullamco. Et ipsum consequat consequat magna do fugiat sint proident nostrud ad fugiat commodo dolor. Est anim do laboris id esse minim do voluptate occaecat nulla esse. Veniam sit dolore aliqua pariatur quis commodo enim nisi sint excepteur pariatur.\r\n", "registered": "Friday, January 10, 2014 2:42 PM", "latitude": 70.057151, "longitude": -46.509685, "tags": [ "pariatur", "est", "adipisicing", "aute", "in", "ex", "eu" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Aida Lindsey" }, { "id": 1, "name": "Harper Roberson" }, { "id": 2, "name": "Flora Woods" } ], "greeting": "Hello, William! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8219387ab6d8ebd8c1d", "index": 64, "guid": "732dfcb2-f8ab-44bf-a11b-d98f5b589993", "isActive": true, "balance": "$1,010.25", "picture": "http://placehold.it/32x32", "age": 26, "eyeColor": "green", "name": { "first": "Barrera", "last": "Sellers" }, "company": "KLUGGER", "email": "barrera.sellers@klugger.tv", "phone": "+1 (968) 510-3228", "address": "954 Verona Place, Homeworth, Louisiana, 6862", "about": "Lorem ex voluptate cupidatat minim officia voluptate enim proident qui mollit dolore ipsum. Non consectetur adipisicing quis consectetur. Non est Lorem ad qui nostrud aute aliqua labore exercitation ea aliquip irure dolor nisi. Excepteur anim ex exercitation velit adipisicing qui excepteur enim culpa consequat sint. Velit consectetur velit culpa eu sint irure culpa consequat anim incididunt ad amet excepteur. Non est anim id sint ipsum id officia dolor commodo dolore labore consectetur.\r\n", "registered": "Sunday, September 14, 2014 1:44 AM", "latitude": -88.561319, "longitude": -44.881241, "tags": [ "aliquip", "eiusmod", "nisi", "aliquip", "minim", "ullamco", "commodo" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bond Goff" }, { "id": 1, "name": "Cathleen Hatfield" }, { "id": 2, "name": "Pansy Burke" } ], "greeting": "Hello, Barrera! You have 8 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821ab4d9564c853db57", "index": 65, "guid": "bba298e6-ebca-4334-afe9-91807ed1b672", "isActive": true, "balance": "$2,345.80", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "brown", "name": { "first": "Mullen", "last": "Stephenson" }, "company": "POLARIUM", "email": "mullen.stephenson@polarium.name", "phone": "+1 (935) 461-2692", "address": "228 Court Square, Beaulieu, Kansas, 9445", "about": "Ex magna proident do dolore nostrud aliqua aute dolore enim mollit consectetur sunt pariatur. Ex id duis enim duis laborum do tempor proident exercitation duis. Aute dolor cillum anim incididunt voluptate. Qui proident consectetur sit laboris ex enim excepteur qui.\r\n", "registered": "Thursday, May 1, 2014 7:57 PM", "latitude": 34.294733, "longitude": 138.270754, "tags": [ "minim", "veniam", "do", "consequat", "esse", "sit", "do" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bobbi Pate" }, { "id": 1, "name": "Moran Griffith" }, { "id": 2, "name": "Marian Hopkins" } ], "greeting": "Hello, Mullen! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8218eb53a92791a3185", "index": 66, "guid": "d297bed2-0986-4d22-b120-0e04c253fb34", "isActive": false, "balance": "$2,586.70", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "brown", "name": { "first": "Leigh", "last": "Kidd" }, "company": "SUNCLIPSE", "email": "leigh.kidd@sunclipse.me", "phone": "+1 (870) 427-3520", "address": "156 Keen Court, Chamizal, Indiana, 4250", "about": "Ut sunt elit irure eiusmod aliquip consectetur in. Dolore id exercitation irure consectetur. Pariatur occaecat cillum nulla cillum esse deserunt minim consectetur aliqua duis eiusmod. Ea proident aliquip cillum ullamco duis elit Lorem dolore aliqua. Do fugiat culpa reprehenderit ea eu non enim.\r\n", "registered": "Wednesday, January 15, 2014 1:57 AM", "latitude": 61.842523, "longitude": -56.422447, "tags": [ "non", "non", "incididunt", "elit", "aliqua", "proident", "nostrud" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Jean Burns" }, { "id": 1, "name": "Patel Wilkinson" }, { "id": 2, "name": "Lillie Lane" } ], "greeting": "Hello, Leigh! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8211c12bb8d837e265b", "index": 67, "guid": "6560e2f0-6bd2-4e19-bcd1-35297f162890", "isActive": false, "balance": "$2,040.59", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "green", "name": { "first": "Perry", "last": "Leonard" }, "company": "CANDECOR", "email": "perry.leonard@candecor.us", "phone": "+1 (945) 556-2907", "address": "359 Barbey Street, Grandview, Alaska, 9082", "about": "Dolor fugiat consequat reprehenderit duis duis ex consectetur ea non ut. Irure et elit et mollit consequat dolor exercitation exercitation deserunt culpa mollit nulla. Est sunt deserunt incididunt exercitation eu aliqua qui elit labore id in eu ex.\r\n", "registered": "Tuesday, August 26, 2014 11:34 PM", "latitude": -67.974417, "longitude": 97.189082, "tags": [ "sit", "ex", "ullamco", "exercitation", "adipisicing", "non", "laboris" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Alissa Ramsey" }, { "id": 1, "name": "Adela Bell" }, { "id": 2, "name": "Pearl Henderson" } ], "greeting": "Hello, Perry! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa8219a0b8e44380bd954", "index": 68, "guid": "4aa2bec3-3eaa-464f-9577-27f6c65e64b7", "isActive": false, "balance": "$3,911.59", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "blue", "name": { "first": "Barbra", "last": "Mejia" }, "company": "ANIXANG", "email": "barbra.mejia@anixang.ca", "phone": "+1 (987) 517-2550", "address": "635 Franklin Street, Allensworth, Florida, 1895", "about": "Aliqua tempor excepteur velit do exercitation laborum commodo laboris aliqua nostrud. Aute aliquip nisi nulla labore id veniam ad voluptate non eiusmod minim mollit. Minim incididunt nostrud sint ex.\r\n", "registered": "Thursday, January 16, 2014 11:04 PM", "latitude": 44.320545, "longitude": -61.392889, "tags": [ "cupidatat", "excepteur", "eu", "consectetur", "fugiat", "aliquip", "deserunt" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Potts Church" }, { "id": 1, "name": "Dianna Valentine" }, { "id": 2, "name": "Valeria Whitney" } ], "greeting": "Hello, Barbra! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821b618d050a076972c", "index": 69, "guid": "ef47a627-c517-4f5a-931b-d67c8a18614b", "isActive": false, "balance": "$1,771.53", "picture": "http://placehold.it/32x32", "age": 32, "eyeColor": "brown", "name": { "first": "Gonzales", "last": "Walker" }, "company": "EVIDENDS", "email": "gonzales.walker@evidends.org", "phone": "+1 (984) 510-3347", "address": "336 Pershing Loop, Croom, Georgia, 9128", "about": "Quis reprehenderit consectetur ad aliqua ad amet incididunt aute irure Lorem veniam. Consequat consequat ut reprehenderit officia cupidatat irure aliqua nostrud veniam velit aliquip magna elit. Ullamco amet nostrud est cupidatat adipisicing fugiat magna anim eu occaecat incididunt. Ut ex ut quis veniam nulla ad ea magna elit incididunt Lorem anim ipsum elit. Aliqua laborum officia magna aliqua. Est quis adipisicing cillum cupidatat sunt velit fugiat mollit exercitation cupidatat sit.\r\n", "registered": "Saturday, June 21, 2014 9:02 PM", "latitude": -64.407501, "longitude": -157.742045, "tags": [ "pariatur", "minim", "consectetur", "consequat", "ad", "aliqua", "ut" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tina Patterson" }, { "id": 1, "name": "Gabriela Nielsen" }, { "id": 2, "name": "Amalia Mueller" } ], "greeting": "Hello, Gonzales! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8210426ced41d67a58b", "index": 70, "guid": "5d045ae8-c32c-43f6-b404-30a943205f5e", "isActive": true, "balance": "$2,054.02", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "green", "name": { "first": "Clarissa", "last": "Madden" }, "company": "NIQUENT", "email": "clarissa.madden@niquent.biz", "phone": "+1 (910) 480-3769", "address": "637 Scholes Street, Needmore, Alabama, 9344", "about": "Sunt nulla ad aliquip incididunt ullamco culpa laboris. Consectetur non enim in officia incididunt deserunt. Quis est consequat ipsum ad. Pariatur nostrud voluptate magna occaecat minim irure sint nostrud voluptate ea labore ullamco quis. Mollit veniam consequat commodo sunt.\r\n", "registered": "Wednesday, January 8, 2014 4:02 AM", "latitude": 46.115788, "longitude": 79.731859, "tags": [ "reprehenderit", "nisi", "id", "consectetur", "sunt", "nostrud", "laboris" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Mandy Buckner" }, { "id": 1, "name": "Hickman Brown" }, { "id": 2, "name": "Kemp Mclaughlin" } ], "greeting": "Hello, Clarissa! You have 8 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8211049b550404f3ce5", "index": 71, "guid": "2f9a6201-6728-4509-8d88-c0a614649311", "isActive": true, "balance": "$1,324.10", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "blue", "name": { "first": "Joyce", "last": "Callahan" }, "company": "OPTYK", "email": "joyce.callahan@optyk.io", "phone": "+1 (893) 544-2327", "address": "567 Crystal Street, Freetown, District Of Columbia, 8319", "about": "Deserunt in nisi id consequat qui. Sunt velit proident id culpa incididunt velit aute dolore labore. Deserunt qui ea adipisicing cillum irure sit sunt excepteur quis et quis nulla dolore pariatur. Consequat ut et veniam dolor velit nulla veniam fugiat commodo velit fugiat ad veniam ad. Anim consequat labore deserunt eiusmod esse. Laborum labore eu et incididunt commodo dolore eiusmod occaecat. Nisi elit duis mollit cillum id enim.\r\n", "registered": "Tuesday, February 4, 2014 2:38 AM", "latitude": -76.437449, "longitude": -169.66079, "tags": [ "ullamco", "non", "officia", "eiusmod", "duis", "cupidatat", "mollit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Hendricks Logan" }, { "id": 1, "name": "Dolly Baird" }, { "id": 2, "name": "Wendi Wallace" } ], "greeting": "Hello, Joyce! You have 6 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa82176dab97e42086b90", "index": 72, "guid": "9680920d-9303-471b-849e-c30e38e06d45", "isActive": false, "balance": "$2,696.40", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "blue", "name": { "first": "Felecia", "last": "Gonzalez" }, "company": "CORIANDER", "email": "felecia.gonzalez@coriander.net", "phone": "+1 (923) 575-3582", "address": "315 Borinquen Pl, Rosburg, Pennsylvania, 9619", "about": "Laboris officia exercitation duis aliqua in sint consectetur. Ad ut labore ipsum ipsum ut culpa labore irure aute. Et exercitation tempor do dolor culpa ad ipsum pariatur adipisicing fugiat. Incididunt amet incididunt minim quis cupidatat pariatur enim fugiat reprehenderit est ipsum labore.\r\n", "registered": "Monday, January 20, 2014 11:59 PM", "latitude": -36.201421, "longitude": 162.994705, "tags": [ "cillum", "reprehenderit", "non", "est", "tempor", "exercitation", "fugiat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Gould Waters" }, { "id": 1, "name": "Ramona Coffey" }, { "id": 2, "name": "Taylor Byers" } ], "greeting": "Hello, Felecia! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821df55849ccd4ca74c", "index": 73, "guid": "01b7c49a-6dac-4b65-906b-4483de07a5e8", "isActive": true, "balance": "$2,037.32", "picture": "http://placehold.it/32x32", "age": 27, "eyeColor": "blue", "name": { "first": "Stanton", "last": "Rutledge" }, "company": "EXOBLUE", "email": "stanton.rutledge@exoblue.com", "phone": "+1 (817) 408-2566", "address": "741 Crooke Avenue, Newry, Nevada, 8555", "about": "Commodo adipisicing ea ipsum non irure quis excepteur. Qui laborum qui sit cupidatat dolore consectetur tempor esse occaecat cillum qui. Dolore in amet ea ex proident do nulla.\r\n", "registered": "Thursday, August 28, 2014 8:35 PM", "latitude": 87.299409, "longitude": 22.167535, "tags": [ "commodo", "aliqua", "irure", "ea", "dolor", "aute", "non" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Best Klein" }, { "id": 1, "name": "Dickerson Mcknight" }, { "id": 2, "name": "Gayle Washington" } ], "greeting": "Hello, Stanton! You have 6 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821f3516c63c6fa05e8", "index": 74, "guid": "c299ecf4-0528-4280-b6b4-909801b1e9dd", "isActive": true, "balance": "$1,695.83", "picture": "http://placehold.it/32x32", "age": 27, "eyeColor": "green", "name": { "first": "Thelma", "last": "Barnett" }, "company": "DUOFLEX", "email": "thelma.barnett@duoflex.biz", "phone": "+1 (947) 416-2234", "address": "325 Tampa Court, Zortman, Illinois, 3609", "about": "Exercitation esse culpa enim anim. Cillum voluptate quis tempor excepteur elit aliquip consequat officia cupidatat laborum ad cupidatat. Mollit exercitation esse fugiat do do id irure tempor et duis. Ut sit reprehenderit velit sit eiusmod in officia nisi commodo magna id in. Lorem sint velit adipisicing aute.\r\n", "registered": "Tuesday, April 22, 2014 5:11 AM", "latitude": 20.61329, "longitude": 48.592063, "tags": [ "et", "excepteur", "nostrud", "ullamco", "quis", "occaecat", "in" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Amy Parks" }, { "id": 1, "name": "Greene Nunez" }, { "id": 2, "name": "Janna Roth" } ], "greeting": "Hello, Thelma! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821637950981c0fa4c8", "index": 75, "guid": "bc58930c-58d8-4223-8a98-20295ac61c4e", "isActive": true, "balance": "$1,836.33", "picture": "http://placehold.it/32x32", "age": 23, "eyeColor": "green", "name": { "first": "Nunez", "last": "Freeman" }, "company": "ZILCH", "email": "nunez.freeman@zilch.co.uk", "phone": "+1 (959) 439-2497", "address": "729 Varick Street, Marne, Tennessee, 1687", "about": "Sunt nulla ipsum non in nulla. Dolore in fugiat in laborum veniam enim dolore cupidatat. Elit tempor ullamco id in minim excepteur et aute ut mollit aliquip qui consequat. Duis esse magna culpa aliqua ad ipsum deserunt laborum amet sint. Quis voluptate quis quis aute.\r\n", "registered": "Monday, August 11, 2014 5:27 PM", "latitude": 85.57657, "longitude": -145.772132, "tags": [ "ullamco", "tempor", "et", "non", "magna", "non", "ex" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Latasha Randolph" }, { "id": 1, "name": "Neva Porter" }, { "id": 2, "name": "Drake Nicholson" } ], "greeting": "Hello, Nunez! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821ed9d29afc180b718", "index": 76, "guid": "45fb73c9-30e9-4e61-b78d-41c8f79a282e", "isActive": false, "balance": "$1,298.91", "picture": "http://placehold.it/32x32", "age": 25, "eyeColor": "green", "name": { "first": "Bentley", "last": "Reyes" }, "company": "ZYPLE", "email": "bentley.reyes@zyple.tv", "phone": "+1 (919) 510-3585", "address": "227 Oakland Place, Farmers, Iowa, 9827", "about": "Cillum proident eiusmod id amet anim laboris elit sint ea et non. Aliqua et reprehenderit amet est ea fugiat aute. Minim aute aliquip nulla elit. Duis ad exercitation excepteur laborum anim occaecat nulla sunt. Quis pariatur nulla Lorem consectetur proident sunt amet est et elit eu sunt. Ut irure voluptate consequat amet sint deserunt quis. Incididunt ea culpa commodo fugiat qui veniam quis Lorem incididunt dolor.\r\n", "registered": "Wednesday, April 9, 2014 1:19 AM", "latitude": -82.587336, "longitude": -74.931056, "tags": [ "dolore", "nisi", "exercitation", "ullamco", "excepteur", "qui", "ut" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Nadia Pearson" }, { "id": 1, "name": "Reba Frost" }, { "id": 2, "name": "Lilia Mcbride" } ], "greeting": "Hello, Bentley! You have 7 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821a936a115315db0b9", "index": 77, "guid": "a1b82517-f6a6-437a-9f2d-2c0043591cfa", "isActive": false, "balance": "$1,016.00", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "blue", "name": { "first": "Morales", "last": "Shields" }, "company": "CORECOM", "email": "morales.shields@corecom.name", "phone": "+1 (814) 407-2079", "address": "472 Coleridge Street, Shasta, Massachusetts, 501", "about": "Ipsum elit adipisicing nostrud quis ut nisi ullamco consectetur ex laborum reprehenderit anim magna fugiat. In nulla dolor esse exercitation elit exercitation. Laborum sit esse velit magna ea irure est ut velit id nisi sint qui. Laborum voluptate amet cupidatat laborum aute in id duis irure. Enim aliqua enim magna ut consequat. Tempor est commodo elit eu et ut occaecat culpa ex ex. Ullamco cillum sint ipsum tempor anim ullamco sit pariatur excepteur dolor mollit ad quis.\r\n", "registered": "Saturday, July 5, 2014 5:10 AM", "latitude": -20.583102, "longitude": -23.34973, "tags": [ "nulla", "proident", "enim", "dolor", "elit", "excepteur", "dolore" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lacey Perry" }, { "id": 1, "name": "Stokes Foley" }, { "id": 2, "name": "Trisha Morales" } ], "greeting": "Hello, Morales! You have 6 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa8214ceb22176ac554f9", "index": 78, "guid": "1aa9258a-f508-4e73-adb9-5d2cce0dff79", "isActive": true, "balance": "$1,100.42", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "blue", "name": { "first": "Chandra", "last": "Patel" }, "company": "PROVIDCO", "email": "chandra.patel@providco.me", "phone": "+1 (875) 430-3869", "address": "543 Bainbridge Street, Kidder, Arkansas, 3624", "about": "Magna ad tempor commodo esse labore mollit sit. Duis laborum excepteur dolor officia exercitation. Elit sunt ex voluptate anim consectetur in ullamco mollit qui non. Cupidatat ipsum et cupidatat cupidatat consequat nulla Lorem culpa minim dolore cupidatat ipsum sint.\r\n", "registered": "Sunday, June 29, 2014 1:41 AM", "latitude": 55.150075, "longitude": -26.185265, "tags": [ "amet", "consectetur", "occaecat", "cillum", "enim", "ut", "occaecat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Geneva Snider" }, { "id": 1, "name": "Rose Michael" }, { "id": 2, "name": "Kirkland Mason" } ], "greeting": "Hello, Chandra! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821050884ba49ad868d", "index": 79, "guid": "88a0d238-e3c9-4b1a-8d19-08c622f9eaae", "isActive": false, "balance": "$1,263.98", "picture": "http://placehold.it/32x32", "age": 30, "eyeColor": "green", "name": { "first": "Elsa", "last": "Chambers" }, "company": "VICON", "email": "elsa.chambers@vicon.us", "phone": "+1 (940) 436-3956", "address": "190 Albemarle Terrace, Sheatown, Hawaii, 2654", "about": "Est do esse elit consectetur elit. Aliqua esse duis est sint non. Enim minim laborum ad duis. Proident laboris quis ea amet nulla occaecat ex laboris duis ut velit.\r\n", "registered": "Saturday, April 19, 2014 3:28 AM", "latitude": 62.679122, "longitude": 95.229313, "tags": [ "magna", "ipsum", "Lorem", "ut", "duis", "elit", "sit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Laurie Fuentes" }, { "id": 1, "name": "Juana Blevins" }, { "id": 2, "name": "Virginia Hester" } ], "greeting": "Hello, Elsa! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821eb0dd28cfdc525a9", "index": 80, "guid": "e1574006-8d49-4399-8b59-92eaa0ed2be1", "isActive": true, "balance": "$2,395.40", "picture": "http://placehold.it/32x32", "age": 23, "eyeColor": "brown", "name": { "first": "Morris", "last": "Trujillo" }, "company": "ZOGAK", "email": "morris.trujillo@zogak.ca", "phone": "+1 (919) 553-3453", "address": "127 Clove Road, Keyport, Puerto Rico, 5969", "about": "Minim do veniam non elit excepteur enim sunt excepteur non amet. Duis eu consequat adipisicing nostrud ad cupidatat tempor occaecat. Ea id consectetur non anim. Irure dolor qui excepteur anim excepteur adipisicing ea sint id aliquip consequat eu id. Ea exercitation officia nostrud ipsum. Voluptate sunt irure aliqua tempor pariatur irure labore ea amet. Quis reprehenderit aliqua pariatur esse id anim laborum ullamco amet.\r\n", "registered": "Sunday, February 2, 2014 12:52 PM", "latitude": -86.963921, "longitude": -157.636932, "tags": [ "occaecat", "amet", "ex", "ea", "exercitation", "aliqua", "elit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lester Watkins" }, { "id": 1, "name": "Kellie Clayton" }, { "id": 2, "name": "Valencia Edwards" } ], "greeting": "Hello, Morris! You have 6 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821f5f0ae13a893ce36", "index": 81, "guid": "9dd75e1e-8f3c-473e-800e-518254719ca1", "isActive": true, "balance": "$1,956.52", "picture": "http://placehold.it/32x32", "age": 36, "eyeColor": "brown", "name": { "first": "Gwen", "last": "Park" }, "company": "INTERGEEK", "email": "gwen.park@intergeek.org", "phone": "+1 (830) 581-3561", "address": "514 Beayer Place, Maxville, New Hampshire, 4162", "about": "Consequat labore commodo nulla veniam aliqua. Tempor ipsum officia exercitation amet elit dolor labore eu voluptate cillum reprehenderit exercitation proident. Id cillum laborum cupidatat reprehenderit anim cillum exercitation culpa aliqua deserunt cupidatat. In proident ea eu nisi est enim. Quis dolor sit aliquip reprehenderit in id ipsum proident duis. Sit eu sint nisi velit. Minim elit nostrud aliquip anim.\r\n", "registered": "Wednesday, September 17, 2014 9:38 AM", "latitude": -66.199245, "longitude": -52.824656, "tags": [ "ex", "magna", "incididunt", "veniam", "mollit", "eu", "sunt" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Nieves Potter" }, { "id": 1, "name": "Welch Reeves" }, { "id": 2, "name": "Hardy Forbes" } ], "greeting": "Hello, Gwen! You have 8 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821a20d620a7ec793ac", "index": 82, "guid": "1ae142ff-8d6a-4e72-a3f1-3ac4349ad0b7", "isActive": false, "balance": "$2,560.11", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "green", "name": { "first": "Erickson", "last": "Lancaster" }, "company": "SCENTRIC", "email": "erickson.lancaster@scentric.biz", "phone": "+1 (980) 465-3465", "address": "412 Jackson Street, Chumuckla, South Carolina, 3216", "about": "Id laborum consectetur pariatur non nulla incididunt labore magna minim duis. Ipsum laboris deserunt velit sunt voluptate. Laboris ipsum duis aliquip non aliqua. Commodo veniam mollit voluptate elit nisi nostrud laboris dolor tempor pariatur duis laborum.\r\n", "registered": "Wednesday, May 7, 2014 8:50 PM", "latitude": -57.590749, "longitude": 117.31662, "tags": [ "ad", "elit", "non", "fugiat", "laborum", "incididunt", "enim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Reeves Nguyen" }, { "id": 1, "name": "Jo Christian" }, { "id": 2, "name": "Myers Lowe" } ], "greeting": "Hello, Erickson! You have 10 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa8213747fd3443999762", "index": 83, "guid": "ec870637-4e65-49c4-abfb-7b99c2d2f094", "isActive": true, "balance": "$2,079.21", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "blue", "name": { "first": "Saundra", "last": "Kemp" }, "company": "LUNCHPOD", "email": "saundra.kemp@lunchpod.io", "phone": "+1 (950) 433-2550", "address": "593 Stuart Street, Edenburg, Texas, 6251", "about": "Ipsum proident et duis reprehenderit in minim in sint dolore enim aute excepteur cillum eiusmod. Do nulla deserunt quis adipisicing sunt reprehenderit. Dolor pariatur tempor sint ullamco.\r\n", "registered": "Tuesday, June 24, 2014 6:44 AM", "latitude": 81.565149, "longitude": -92.061448, "tags": [ "magna", "commodo", "esse", "ad", "labore", "amet", "mollit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Tommie Mays" }, { "id": 1, "name": "Lou Hubbard" }, { "id": 2, "name": "Jenna Gentry" } ], "greeting": "Hello, Saundra! You have 9 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821524a5fd2a5f037a2", "index": 84, "guid": "e7894fe9-efd4-44ae-afd5-49bfde09b000", "isActive": true, "balance": "$2,320.08", "picture": "http://placehold.it/32x32", "age": 37, "eyeColor": "green", "name": { "first": "Christensen", "last": "Wolf" }, "company": "GLUKGLUK", "email": "christensen.wolf@glukgluk.net", "phone": "+1 (937) 519-3107", "address": "460 Porter Avenue, Irwin, South Dakota, 2498", "about": "Ullamco reprehenderit non aliquip amet do deserunt nostrud ea deserunt fugiat. Commodo pariatur est officia dolor dolore in excepteur pariatur laborum ut. Occaecat cillum ullamco nulla eu esse non nisi pariatur ipsum amet do ea ad culpa. Excepteur esse elit laborum deserunt ad consequat. Culpa esse esse nostrud commodo laborum officia sint ea mollit. Dolor culpa pariatur fugiat cillum quis proident non enim esse pariatur duis adipisicing amet. Consequat minim aliqua enim excepteur.\r\n", "registered": "Saturday, February 8, 2014 10:20 PM", "latitude": 22.478522, "longitude": 30.070646, "tags": [ "quis", "ad", "adipisicing", "exercitation", "non", "eu", "anim" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Bright Moon" }, { "id": 1, "name": "Stephenson Sears" }, { "id": 2, "name": "Fletcher Swanson" } ], "greeting": "Hello, Christensen! You have 9 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa82160fa0826e90b747b", "index": 85, "guid": "af08cc83-e8c9-4bcd-84b3-2f3251cf9a02", "isActive": true, "balance": "$2,575.60", "picture": "http://placehold.it/32x32", "age": 29, "eyeColor": "brown", "name": { "first": "Weaver", "last": "Parker" }, "company": "RETROTEX", "email": "weaver.parker@retrotex.com", "phone": "+1 (951) 411-2545", "address": "560 Madison Place, Sidman, Ohio, 5153", "about": "Reprehenderit esse dolor tempor consectetur occaecat exercitation consectetur irure commodo. Et eiusmod aute ipsum eu commodo qui id anim proident. Excepteur labore laboris aliqua incididunt ut nisi consequat deserunt dolore officia velit sint consectetur. Laboris sint minim mollit duis. Excepteur nostrud incididunt aute consequat ad magna eu quis. Id dolor eu aliqua deserunt cillum sint ea et nostrud. Lorem amet cillum nulla tempor commodo mollit aliquip do est enim enim.\r\n", "registered": "Thursday, February 6, 2014 12:55 PM", "latitude": 87.778566, "longitude": -122.687026, "tags": [ "eu", "voluptate", "commodo", "magna", "ullamco", "nulla", "ea" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Ratliff Mckinney" }, { "id": 1, "name": "Walker Frye" }, { "id": 2, "name": "Mcgowan Daniel" } ], "greeting": "Hello, Weaver! You have 5 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8217a543d20bd4b10c1", "index": 86, "guid": "5b670ab7-4ee6-4b8e-b379-4e1849b6e329", "isActive": false, "balance": "$3,114.39", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "green", "name": { "first": "Annabelle", "last": "Sanders" }, "company": "PHORMULA", "email": "annabelle.sanders@phormula.biz", "phone": "+1 (982) 489-2678", "address": "970 Llama Court, Moraida, Maine, 8694", "about": "Nostrud adipisicing magna nulla magna voluptate duis eu voluptate cupidatat ut dolore excepteur esse dolor. Aliquip exercitation occaecat amet excepteur sit. Velit adipisicing esse labore veniam duis ullamco in ea. Adipisicing eiusmod cillum veniam nostrud sint laboris sit id officia. Esse esse anim sint do ea id. Esse ipsum mollit sit laborum nostrud mollit nulla id.\r\n", "registered": "Tuesday, January 7, 2014 7:34 AM", "latitude": 9.515348, "longitude": -99.138606, "tags": [ "ipsum", "sint", "dolor", "laborum", "est", "consequat", "magna" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Juliet Clements" }, { "id": 1, "name": "Jeannine Pruitt" }, { "id": 2, "name": "Chambers Warren" } ], "greeting": "Hello, Annabelle! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa82179c1fe89e1ccec4d", "index": 87, "guid": "31ecaae4-6443-4c00-a20d-82100c49b488", "isActive": true, "balance": "$3,803.83", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "blue", "name": { "first": "Kelley", "last": "Miles" }, "company": "AQUASURE", "email": "kelley.miles@aquasure.co.uk", "phone": "+1 (819) 529-2967", "address": "680 Monument Walk, Wakulla, Vermont, 8903", "about": "Ea sint dolor nostrud dolor id commodo esse nisi. Reprehenderit minim dolore nostrud sint incididunt excepteur reprehenderit enim velit velit. Proident officia velit Lorem dolore ullamco occaecat.\r\n", "registered": "Saturday, May 3, 2014 12:23 AM", "latitude": 73.767872, "longitude": -118.631186, "tags": [ "consectetur", "irure", "nostrud", "nostrud", "aliquip", "quis", "reprehenderit" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Maynard Townsend" }, { "id": 1, "name": "Carlene Molina" }, { "id": 2, "name": "Mai Bentley" } ], "greeting": "Hello, Kelley! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8218de20c1f1e1e93fa", "index": 88, "guid": "8f6b0aac-f2ba-45aa-a7c8-76c413bdeb7a", "isActive": true, "balance": "$1,898.86", "picture": "http://placehold.it/32x32", "age": 38, "eyeColor": "brown", "name": { "first": "Mckay", "last": "Velasquez" }, "company": "NORALEX", "email": "mckay.velasquez@noralex.tv", "phone": "+1 (973) 599-3463", "address": "152 Roebling Street, Mathews, Delaware, 7958", "about": "Nostrud esse dolor excepteur cillum aliqua. Ea nulla elit minim sint non culpa id. Et ullamco aute laborum incididunt sint quis. Tempor tempor aliqua in sunt. Minim elit dolor quis excepteur exercitation adipisicing. Pariatur incididunt tempor irure proident exercitation deserunt sint.\r\n", "registered": "Monday, August 4, 2014 5:00 AM", "latitude": 81.463276, "longitude": -66.291508, "tags": [ "nisi", "anim", "qui", "est", "qui", "ipsum", "ullamco" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Myrna Rollins" }, { "id": 1, "name": "Tricia Gilliam" }, { "id": 2, "name": "Collins Obrien" } ], "greeting": "Hello, Mckay! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821b3490524365bc954", "index": 89, "guid": "43825015-fed6-40c8-bd80-8aaf228067f9", "isActive": false, "balance": "$3,035.21", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "blue", "name": { "first": "Brandy", "last": "Hayden" }, "company": "OMNIGOG", "email": "brandy.hayden@omnigog.name", "phone": "+1 (827) 481-2334", "address": "537 Pioneer Street, Saticoy, Palau, 803", "about": "Ea velit consectetur ipsum ut elit pariatur id labore sunt eu incididunt est aliqua. Veniam esse officia do non officia cupidatat proident id officia esse tempor non mollit dolore. Elit voluptate nulla exercitation laboris ex ad irure est do enim aute velit aute. Cillum adipisicing nisi dolor velit duis ad fugiat deserunt non commodo Lorem fugiat sint qui. Aute consectetur magna incididunt tempor in esse consectetur magna qui sit. Culpa consequat laborum duis adipisicing dolor in deserunt ut velit ea ex dolore ullamco esse.\r\n", "registered": "Wednesday, February 12, 2014 7:32 PM", "latitude": 4.319892, "longitude": 81.048442, "tags": [ "labore", "ullamco", "commodo", "quis", "aute", "nulla", "do" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Riggs Flynn" }, { "id": 1, "name": "Kidd Guerrero" }, { "id": 2, "name": "Rosario Wade" } ], "greeting": "Hello, Brandy! You have 10 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8211b737d086264c9a9", "index": 90, "guid": "ec5fe190-d16f-4728-bce1-c5140852c583", "isActive": true, "balance": "$2,932.98", "picture": "http://placehold.it/32x32", "age": 28, "eyeColor": "green", "name": { "first": "Sonia", "last": "Orr" }, "company": "MUSANPOLY", "email": "sonia.orr@musanpoly.me", "phone": "+1 (822) 422-2010", "address": "908 Dekalb Avenue, Elfrida, Arizona, 6925", "about": "Ut cillum ex irure amet aliquip voluptate Lorem fugiat reprehenderit sunt reprehenderit quis. Nulla laborum sunt elit ad labore ut cupidatat cillum eiusmod est. Ea irure amet excepteur mollit eu ipsum id adipisicing occaecat. Cupidatat sunt do veniam esse enim sint qui voluptate sint. Qui officia ad cupidatat mollit laboris. Duis tempor fugiat ea mollit cupidatat exercitation sunt incididunt.\r\n", "registered": "Thursday, September 25, 2014 8:21 PM", "latitude": 71.876999, "longitude": 79.322401, "tags": [ "pariatur", "sit", "culpa", "dolore", "cupidatat", "minim", "cillum" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Morgan Pittman" }, { "id": 1, "name": "Bullock Cannon" }, { "id": 2, "name": "Lakeisha Lynch" } ], "greeting": "Hello, Sonia! You have 9 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821b271c92236e5e9b0", "index": 91, "guid": "57cff12c-2a18-48c2-b15a-3c393de707b6", "isActive": false, "balance": "$1,874.97", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "green", "name": { "first": "Stephens", "last": "Whitaker" }, "company": "EARTHPLEX", "email": "stephens.whitaker@earthplex.us", "phone": "+1 (960) 419-2183", "address": "368 Division Avenue, Fivepointville, Colorado, 8609", "about": "Do aliquip laboris irure consectetur esse reprehenderit. Cillum ex deserunt fugiat ut dolore excepteur culpa eiusmod sit ullamco velit consequat consequat aliquip. Nostrud officia est enim velit fugiat laboris.\r\n", "registered": "Monday, May 26, 2014 8:04 PM", "latitude": 7.153481, "longitude": 100.823578, "tags": [ "laborum", "irure", "dolore", "enim", "nisi", "cillum", "deserunt" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Perkins Campos" }, { "id": 1, "name": "Murray Randall" }, { "id": 2, "name": "Wallace Blackwell" } ], "greeting": "Hello, Stephens! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821c115ee94a728efa4", "index": 92, "guid": "7bbe7ace-73f9-4d25-8f20-b50f4b9d4e60", "isActive": true, "balance": "$1,168.18", "picture": "http://placehold.it/32x32", "age": 33, "eyeColor": "green", "name": { "first": "Shepard", "last": "Sanchez" }, "company": "YOGASM", "email": "shepard.sanchez@yogasm.ca", "phone": "+1 (959) 436-3299", "address": "154 Seeley Street, Witmer, Missouri, 994", "about": "Adipisicing ut id nulla occaecat enim officia reprehenderit non magna dolor Lorem. Culpa ad proident duis cupidatat nostrud occaecat esse elit pariatur quis Lorem. Velit exercitation anim dolore nisi labore consequat cupidatat magna nostrud sint ut deserunt enim.\r\n", "registered": "Saturday, February 22, 2014 10:23 PM", "latitude": -81.429217, "longitude": -27.374426, "tags": [ "aliqua", "minim", "consequat", "aliqua", "qui", "proident", "consequat" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Sara Bruce" }, { "id": 1, "name": "Kimberley Mcdaniel" }, { "id": 2, "name": "Tammi England" } ], "greeting": "Hello, Shepard! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821a094fdd2592addbd", "index": 93, "guid": "69bc8858-bd55-4fa0-95f9-d2cb680a390c", "isActive": false, "balance": "$1,746.96", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "blue", "name": { "first": "Kristy", "last": "Johnston" }, "company": "KONGLE", "email": "kristy.johnston@kongle.org", "phone": "+1 (823) 558-3033", "address": "122 Cadman Plaza, Suitland, Minnesota, 3918", "about": "Laboris excepteur ea nostrud incididunt est laborum dolor. Consequat ad duis aute proident incididunt commodo adipisicing. Enim voluptate sunt et est excepteur eiusmod commodo. Mollit fugiat reprehenderit ex ullamco magna laboris commodo mollit. Cupidatat tempor tempor minim dolore. Excepteur ipsum esse ipsum nulla.\r\n", "registered": "Wednesday, January 29, 2014 11:15 PM", "latitude": 15.335329, "longitude": -78.001472, "tags": [ "veniam", "consequat", "ex", "anim", "culpa", "ullamco", "ex" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Johns Cochran" }, { "id": 1, "name": "Sheppard Hicks" }, { "id": 2, "name": "Cervantes Donovan" } ], "greeting": "Hello, Kristy! You have 10 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821311b6242dc75f718", "index": 94, "guid": "9de76ab8-2ef7-4b46-a478-5dea8732650a", "isActive": false, "balance": "$2,549.05", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "blue", "name": { "first": "Melendez", "last": "Golden" }, "company": "GRONK", "email": "melendez.golden@gronk.biz", "phone": "+1 (986) 553-2124", "address": "647 Broadway , Reno, Northern Mariana Islands, 9487", "about": "Aliquip pariatur deserunt culpa eu nostrud eu amet. Adipisicing elit occaecat aliqua ipsum ut. Cillum magna consectetur elit esse sint laboris duis. In ea enim aute eiusmod culpa. Labore quis sunt aliquip excepteur tempor irure amet consequat eu excepteur et occaecat.\r\n", "registered": "Monday, April 14, 2014 9:41 AM", "latitude": 55.489443, "longitude": 3.620039, "tags": [ "pariatur", "magna", "quis", "in", "irure", "amet", "esse" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Hilary Dennis" }, { "id": 1, "name": "Tyler Burgess" }, { "id": 2, "name": "Eugenia Donaldson" } ], "greeting": "Hello, Melendez! You have 9 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "543fa821c394a9871527c834", "index": 95, "guid": "ec0f31d4-7264-4649-9af9-2716082915d3", "isActive": true, "balance": "$2,810.24", "picture": "http://placehold.it/32x32", "age": 34, "eyeColor": "brown", "name": { "first": "Eleanor", "last": "Curtis" }, "company": "ZAPPIX", "email": "eleanor.curtis@zappix.io", "phone": "+1 (824) 461-3776", "address": "981 Lyme Avenue, Oneida, Marshall Islands, 6015", "about": "Commodo labore do pariatur exercitation voluptate ea velit velit qui ex duis. Commodo est excepteur ad labore aute enim eu. Adipisicing irure exercitation sint consectetur exercitation occaecat aute exercitation commodo.\r\n", "registered": "Monday, May 5, 2014 7:51 AM", "latitude": -5.604007, "longitude": -125.532894, "tags": [ "aliqua", "commodo", "non", "magna", "quis", "velit", "irure" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Monica Carr" }, { "id": 1, "name": "Coleman Simpson" }, { "id": 2, "name": "Wilma Fisher" } ], "greeting": "Hello, Eleanor! You have 7 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa821a5b5e35d24f265b3", "index": 96, "guid": "c865c0ff-8505-4d02-af0a-c5a275d03fd5", "isActive": true, "balance": "$3,192.24", "picture": "http://placehold.it/32x32", "age": 22, "eyeColor": "blue", "name": { "first": "Terrell", "last": "Greene" }, "company": "AUTOGRATE", "email": "terrell.greene@autograte.net", "phone": "+1 (933) 557-3825", "address": "435 Bridgewater Street, Fresno, New Jersey, 8124", "about": "Elit sit ut anim reprehenderit anim ipsum esse tempor aliqua id ullamco. Exercitation est velit aliquip est elit mollit magna velit. Elit eiusmod esse voluptate consectetur enim id exercitation adipisicing et laborum. Irure fugiat ut sint exercitation dolor nostrud qui mollit eiusmod cupidatat. Commodo ad dolore incididunt ex quis nostrud veniam pariatur aliquip ea reprehenderit reprehenderit.\r\n", "registered": "Sunday, September 21, 2014 3:31 AM", "latitude": 76.638623, "longitude": 147.966829, "tags": [ "aliquip", "qui", "nisi", "ut", "non", "proident", "et" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Lucile Jordan" }, { "id": 1, "name": "Bender Sheppard" }, { "id": 2, "name": "Milagros Francis" } ], "greeting": "Hello, Terrell! You have 8 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa8216cc444257e522ec0", "index": 97, "guid": "90c19881-6521-4012-aba7-f4d143953965", "isActive": false, "balance": "$1,509.96", "picture": "http://placehold.it/32x32", "age": 31, "eyeColor": "green", "name": { "first": "Holman", "last": "Hines" }, "company": "NORSUP", "email": "holman.hines@norsup.com", "phone": "+1 (925) 565-2825", "address": "902 Monroe Street, Marienthal, Virgin Islands, 2354", "about": "Eu cupidatat consectetur labore voluptate nulla non amet incididunt labore non magna tempor. Veniam et sint qui reprehenderit reprehenderit sint ut laboris elit. Pariatur in eu dolore culpa nisi laboris officia magna do velit. Cupidatat proident excepteur officia labore irure sunt elit velit dolor commodo. Minim quis sint minim non incididunt Lorem elit cupidatat adipisicing quis esse non sint et. Laborum culpa incididunt incididunt fugiat minim ex deserunt et.\r\n", "registered": "Sunday, April 27, 2014 8:05 PM", "latitude": 61.825518, "longitude": -28.393161, "tags": [ "voluptate", "veniam", "Lorem", "ex", "in", "est", "exercitation" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Cecelia Chapman" }, { "id": 1, "name": "Isabella Castaneda" }, { "id": 2, "name": "Montoya Chen" } ], "greeting": "Hello, Holman! You have 9 unread messages.", "favoriteFruit": "apple" }, { "_id": "543fa8210659aa5cdca41f7e", "index": 98, "guid": "81adf15d-24b6-454c-a75f-f5be12f6ac75", "isActive": false, "balance": "$2,564.95", "picture": "http://placehold.it/32x32", "age": 39, "eyeColor": "green", "name": { "first": "Horton", "last": "Poole" }, "company": "GROK", "email": "horton.poole@grok.biz", "phone": "+1 (908) 520-3683", "address": "141 Gatling Place, Hackneyville, Oregon, 2976", "about": "Consequat nisi reprehenderit incididunt id minim cillum. Lorem reprehenderit fugiat irure dolor excepteur velit. Est nostrud culpa ut reprehenderit in duis id voluptate pariatur voluptate. Exercitation Lorem esse exercitation Lorem esse. Excepteur mollit sit ut voluptate ipsum pariatur anim sint sunt cillum sit consequat.\r\n", "registered": "Thursday, September 18, 2014 6:11 AM", "latitude": -3.525694, "longitude": -103.351985, "tags": [ "deserunt", "voluptate", "cillum", "id", "magna", "deserunt", "incididunt" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Hope Lara" }, { "id": 1, "name": "French Garner" }, { "id": 2, "name": "Stein Sykes" } ], "greeting": "Hello, Horton! You have 5 unread messages.", "favoriteFruit": "banana" }, { "_id": "543fa821cf1b15f13d8c3938", "index": 99, "guid": "44533089-c11a-4656-b2d1-9ab6be887f30", "isActive": false, "balance": "$3,192.31", "picture": "http://placehold.it/32x32", "age": 37, "eyeColor": "green", "name": { "first": "Wanda", "last": "Wiggins" }, "company": "ZEPITOPE", "email": "wanda.wiggins@zepitope.co.uk", "phone": "+1 (998) 461-3780", "address": "427 Canton Court, Heil, Utah, 8283", "about": "Do officia et exercitation dolor esse. Ut nisi eiusmod dolore laborum ad ex mollit minim. Pariatur qui culpa ullamco ex eiusmod.\r\n", "registered": "Tuesday, August 26, 2014 6:59 PM", "latitude": 44.770809, "longitude": 150.936963, "tags": [ "consectetur", "mollit", "laborum", "ipsum", "quis", "cupidatat", "in" ], "range": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "friends": [ { "id": 0, "name": "Kristie Cain" }, { "id": 1, "name": "Geraldine Zimmerman" }, { "id": 2, "name": "Ingrid Harper" } ], "greeting": "Hello, Wanda! You have 5 unread messages.", "favoriteFruit": "strawberry" } ]